zoukankan      html  css  js  c++  java
  • 序列化和反序列化

    序列化和反序列化是什么

    故名思议就是将结构化的对象转换为字节序列,反之就叫做反序列化。

    为什么要序列化和反序列化?

    内存当中的对象是结构化的,当你需要将这个对象在网络当中传输的时候,或者要保存到文件或者数据库当中的时候,你就需要将它序列化成字节流,便于处理。

    而反过来,传输过去之后,或者从文件和数据库里读取出来的时候,又要重新构建恢复出原来的对象。

    类比就是,比如我们打电话,电线不能直接传声音,需要把声音转换为电流,过去再把电流转换为声音。

    序列化的种类

    一般有这么几种,xml,json,还有Binary,Soap。

    xml方式

    .NET 中序列化主要用到的类都在System.Xml.Serialization

    对于xml方式的序列化对象,只能序列化公共属性,必须有无参构造函数,添加特性不是必须的,但是特性(指`System.Xml.Serialization命名空间下的)可以控制类的序列化,特性使用方式如下:

    [XmlRoot]
    class Cat
    {
        [XmlElement]
        public string Name { get; set; }
        [XmlAttribute]
        public int Age { get; set; }
        [XmlIgnore]
        public string Owner { get; set; }
    }
    
    [XmlRoot]
    class CatCollection
    {
        [XmlArray, XmlArrayItem]
        public Cat[] Cats { get; set; }
    }
    

    序列化过程代码如下:

    MemoryStream ms = new MemoryStream();
    
    XmlSerializer serializer = new XmlSerializer(typeof(Passport));
    serializer.Serialize(ms, single);
    serializer.Serialize(Console.Out, single);
    
    string xml_text = Encoding.Default.GetString(ms.ToArray());
    Console.WriteLine(xml_text);
    
    //移动游标很重要
    ms.Seek(0, SeekOrigin.Begin);
    
    Passport p = (Passport)serializer.Deserialize(new XmlTextReader(ms));
    
    Console.WriteLine(p.Name);
    Console.WriteLine("Job Done");
    
    

    Binary方式

    命名空间System.Runtime.Serialization.Formatters.Binary,需要添加对应的dll。
    必须使用System命名空间下的Serializable特性标记类

    [Serializable]
    public class Passport
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public int Age { get; set; }
        public string Nation { get; set; }
        public string BirthPlace { get; set; }
    }
    
    
    MemoryStream ms = new MemoryStream();
    BinaryFormatter formatter = new BinaryFormatter();
    formatter.Serialize(ms, single);
    Console.WriteLine("Serialization to Binary Done");
    
    ms.Seek(0, SeekOrigin.Begin);
    
    Passport p = (Passport)formatter.Deserialize(ms);
    Console.WriteLine(p.Name);
    Console.WriteLine("DeSerialization from Binary Done");
    
    

    Soap方式

    Soap的操作和要求类似Binary,命名空间是System.Runtime.Serialization.Formatters.Soap

    MemoryStream ms = new MemoryStream();
    SoapFormatter soap = new SoapFormatter();
    soap.Serialize(ms, single);
    
    foreach (var item in ms.ToArray())
    {
        Console.Write((char)item);
    }
    
    ms.Seek(0, SeekOrigin.Begin);
    
    Passport p = soap.Deserialize(ms) as Passport;
    Console.WriteLine(p.Name);
    
    Console.WriteLine("DeSerialization from Soap Done");
    
    

    json方式

    json方式序列化目前用的非常的广泛,会专门用一篇来说。
    本文到此。

  • 相关阅读:
    iOS10权限声明国际化
    用"僵尸对象"调试内存管理问题
    windows系统下的两个批处理命令
    解决windows系统下打开应用弹出丢失libmysql.dll的问题
    简单的cocos2dx笔试题
    解决cocos2dx 3.x 导入cocostudio的ui界面出现错位问题
    mac 使用homebrew 安装mysql
    cocos2dx for lua 简单的翻牌动画
    cocos2dx for lua A*寻路算法实现2
    解决升级mac os X EI Capitan后遇到LibclangError: dlopen(libclang.dylib, 6): image not found.的问题
  • 原文地址:https://www.cnblogs.com/newlifechou/p/8945468.html
Copyright © 2011-2022 走看看