序列化和反序列化
序列化和反序列化是什么
故名思议就是将结构化的对象转换为字节序列,反之就叫做反序列化。
为什么要序列化和反序列化?
内存当中的对象是结构化的,当你需要将这个对象在网络当中传输的时候,或者要保存到文件或者数据库当中的时候,你就需要将它序列化成字节流,便于处理。
而反过来,传输过去之后,或者从文件和数据库里读取出来的时候,又要重新构建恢复出原来的对象。
类比就是,比如我们打电话,电线不能直接传声音,需要把声音转换为电流,过去再把电流转换为声音。
序列化的种类
一般有这么几种,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方式序列化目前用的非常的广泛,会专门用一篇来说。
本文到此。