序列化和反序列化

打印 上一主题 下一主题

主题 875|帖子 875|积分 2625

序列化方式说明


  • 二进制序列化器:序列化结果人看不懂,但是序列化后体积小
  • soap序列化器:人能看懂,没啥阅读体验,文件体积比较大
  • xml序列化器:可阅读性好,体积中等
  • 序列化为json格式
二进制序列化器


  • 要序列化的实体必须标记[Serializable]特性,表示可以序列化
  • 不想序列化的字段可以标记[NonSerialized]特性
实体
  1. [Serializable]
  2. public class People
  3. {
  4.     public int Id;
  5.     public string Name;
  6.     public string Address;
  7.     [NonSerialized]
  8.     public string Sex;
  9. }
复制代码
序列化
  1. List<People> peoples = GetPeoples();//创建一个实体集合
  2. string fileName = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "log", "BinarySerialize.txt");
  3. using (FileStream fs = new FileStream(fileName,FileMode.OpenOrCreate, FileAccess.ReadWrite))
  4. {
  5.     BinaryFormatter formatter = new BinaryFormatter();
  6.     formatter.Serialize(fs, peoples);
  7. }
复制代码
反序列化
  1. string fileName = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "log", "BinarySerialize.txt");
  2. using (FileStream fs = new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.ReadWrite))
  3. {
  4.     BinaryFormatter formatter = new BinaryFormatter();
  5.     List<People> peoples = formatter.Deserialize(fs) as List<People>;
  6. }
复制代码
序列化结果
​                一个看不懂的二进制文档
soap序列化器


  • 要序列化的实体必须标记[Serializable]特性,表示可以序列化
  • 不想序列化的字段可以标记[NonSerialized]特性
  • soap不能序列化泛型对象
实体
  1. [Serializable]
  2. public class People
  3. {
  4.     public int Id;
  5.     public string Name;
  6.     public string Address;
  7.     [NonSerialized]
  8.     public string Sex;
  9. }
复制代码
序列化
  1. List<People> peoples = GetPeoples();
  2. string fileName = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "log", "SoapSerialize.txt");
  3. using (FileStream fs = new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.ReadWrite))
  4. {
  5.     SoapFormatter formatter = new SoapFormatter();
  6.     formatter.Serialize(fs, peoples.ToArray());
  7. }
复制代码
反序列化
  1. string fileName = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "log", "SoapSerialize.txt");
  2. using (FileStream fs = new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.ReadWrite))
  3. {
  4.     SoapFormatter formatter = new SoapFormatter();
  5.     People[] peoples = (People[])formatter.Deserialize(fs);
  6. }
复制代码
序列化结果
  1. <SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:clr="http://schemas.microsoft.com/soap/encoding/clr/1.0" SOAP-ENV:encoding>
  2. <SOAP-ENV:Body>
  3. <SOAP-ENC:Array SOAP-ENC:arrayType="a1:People[3]" xmlns:a1="http://schemas.microsoft.com/clr/nsassem/对象序列化/对象序列化%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3Dnull">
  4. <item href="#ref-3"/>
  5. <item href="#ref-4"/>
  6. <item href="#ref-5"/>
  7. </SOAP-ENC:Array>
  8. <a1:People id="ref-3" xmlns:a1="http://schemas.microsoft.com/clr/nsassem/对象序列化/对象序列化%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3Dnull">
  9. <Id>1</Id>
  10. <Name id="ref-6">张三</Name>
  11. <Address id="ref-7">江苏</Address>
  12. </a1:People>
  13. <a1:People id="ref-4" xmlns:a1="http://schemas.microsoft.com/clr/nsassem/对象序列化/对象序列化%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3Dnull">
  14. <Id>2</Id>
  15. <Name id="ref-8">李四</Name>
  16. <Address id="ref-9">安徽</Address>
  17. </a1:People>
  18. <a1:People id="ref-5" xmlns:a1="http://schemas.microsoft.com/clr/nsassem/对象序列化/对象序列化%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3Dnull">
  19. <Id>3</Id>
  20. <Name id="ref-10">王五</Name>
  21. <Address id="ref-11">浙江</Address>
  22. </a1:People>
  23. </SOAP-ENV:Body>
  24. </SOAP-ENV:Envelope>
复制代码
XML序列化器


  • 创建XML序列化器时需要传入需要序列化的对象的类型
  • 不想序列化的字段可以标记[XmlIgnore]特性

实体
  1. public class People
  2. {
  3.     public int Id;
  4.     [XmlElement(ElementName = "姓名")]//设置节点别名
  5.     public string Name;
  6.     [XmlIgnore]//忽略Address不进行序列化
  7.     public string Address;
  8.     [XmlAttribute(AttributeName = "性别")]//设置这个字段作为xml中的属性出现,并设置了属性名称
  9.     public string Sex;
  10. }
复制代码
序列化
  1. List<People> peoples = GetPeoples();
  2. string fileName = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "log", "XmlSerialize.xml");
  3. using (FileStream fs = new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.ReadWrite))
  4. {
  5.     XmlSerializer formatter = new XmlSerializer(typeof(List<People>));
  6.     formatter.Serialize(fs, peoples);
  7. }
复制代码
反序列化
  1. string fileName = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "log", "XmlSerialize.xml");
  2. using (FileStream fs = new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.ReadWrite))
  3. {
  4.     XmlSerializer formatter = new XmlSerializer(typeof(List<People>));
  5.     List<People> peoples = (List<People>)formatter.Deserialize(fs);
  6. }
复制代码
序列化结果
  1. <?xml version="1.0"?>
  2. <ArrayOfPeople xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  3.   <People 性别="男">
  4.     <Id>1</Id>
  5.     <姓名>张三</姓名>
  6.   </People>
  7.   <People 性别="女">
  8.     <Id>2</Id>
  9.     <姓名>李四</姓名>
  10.   </People>
  11.   <People 性别="男">
  12.     <Id>3</Id>
  13.     <姓名>王五</姓名>
  14.   </People>
  15. </ArrayOfPeople>
复制代码
序列化为Json格式


  • 安装Nuget包Newtonsoft.Json
序列化和反序列化
  1. List<People> peoples = GetPeoples();
  2. string json = JsonConvert.SerializeObject(peoples);
  3. List<People> newPeople = JsonConvert.DeserializeObject<List<People>>(json);
复制代码
序列化结果
  1. [{"Id":1,"Name":"张三","Address":"江苏"},{"Id":2,"Name":"李四","Address":"安徽"},{"Id":3,"Name":"王五","Address":"浙江"}]
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

风雨同行

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表