序列化和反序列化

序列化和反序列化是什么

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

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

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

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

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

序列化的种类

一般有这么几种,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方式序列化目前用的非常的广泛,会专门用一篇来说。
本文到此。

posted @ 2018-04-25 22:23  xsz1234  阅读(534)  评论(0编辑  收藏  举报