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

    一、什么是序列化

    简单的说,序列化就是格式化。是把数据按一定的格式保存起来,方便使用。

    二、序列化的种类及其案例

    首先创建要序列化的数据源,下面进行各种类型的序列化的时候需要用到。

    1 List<Person> list = new List<Person>() {
    2                 new Person() { Name="张三",Age=19,Email="zhangsan@sina.com" },
    3                 new Person() {Name="李四",Age=23,Email="lisi@sina.com" },
    4                 new Person() {Name="王五",Age=34,Email="wangwu@sina.com" }
    5             };
    View Code

    1.JavaScript序列化

    1             JavaScriptSerializer jsSerializer = new JavaScriptSerializer();
    2             string str = jsSerializer.Serialize(list);
    3 
    4             using (StreamWriter sWrite = new StreamWriter("list.txt", false))
    5             {
    6                 sWrite.Write(str);
    7             }
    View Code

    序列化后的结果:

    1 [
    2 {"Name":"张三","Age":19,"Email":"zhangsan@sina.com"},
    3 {"Name":"李四","Age":23,"Email":"lisi@sina.com"},
    4 {"Name":"王五","Age":34,"Email":"wangwu@sina.com"}
    5 ]
    View Code

    其实就是json形式的字符串。

    2.xml序列化 

    1             XmlSerializer xmlSerializer = new XmlSerializer(typeof(List<Person>));
    2 
    3             using (FileStream fs = new FileStream("list.xml", FileMode.Create))
    4             {
    5                 xmlSerializer.Serialize(fs, list);
    6             }
    View Code

    序列化后的结果:

     1 <?xml version="1.0"?>
     2 <ArrayOfPerson xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
     3   <Person>
     4     <Name>张三</Name>
     5     <Age>19</Age>
     6     <Email>zhangsan@sina.com</Email>
     7   </Person>
     8   <Person>
     9     <Name>李四</Name>
    10     <Age>23</Age>
    11     <Email>lisi@sina.com</Email>
    12   </Person>
    13   <Person>
    14     <Name>王五</Name>
    15     <Age>34</Age>
    16     <Email>wangwu@sina.com</Email>
    17   </Person>
    18 </ArrayOfPerson>
    View Code

    3.二进制序列化 

    1 BinaryFormatter binarySerializer = new BinaryFormatter();
    2             using (FileStream fs = new FileStream("binary.txt",FileMode.Create))
    3             {
    4                 binarySerializer.Serialize(fs,list);
    5             }
    View Code

     序列化后的结果:

    1               @搴忓垪鍖? Version=1.0.0.0, Culture=neutral, PublicKeyToken=null   wSystem.Collections.Generic.List`1[[搴忓垪鍖?Person, 搴忓垪鍖? Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]   _items_size_version  搴忓垪鍖?Person[]                          搴忓垪鍖?Person                        
    2    搴忓垪鍖?Person   <Name>k__BackingField<Age>k__BackingField<Email>k__BackingField       寮犱笁      zhangsan@sina.com             鏉庡洓   
    3    
    4 lisi@sina.com         鐜嬩簲"      wangwu@sina.com
    View Code

    注意:

    1.反编译二进制后的exe文件,我们发现,二进制序列化是对属性对应的字段序列化,而不是对属性序列化,由于编译器生成的字段可能会变,所以,我们在进行序列化的时候,最好不要用自动属性。我们在person类中加几个字段,对比下。如图:

    不是自动属性对应的结果:

    自动属性对应的结果:

    2.序列化List<person>时,person及其父类都要序列化,person中的所有成员对应的对象也要序列化。

    3.方法不会序列化,同样类实现的接口也不用实例化。(接口对应方法)

    4.如果某个字段不需要序列化,加上NonSerialized即可。

    4.反序列化

    反序列化就是把序列化后的文件中保存的数据,重新在保存的对象的中生成。它需要重新创建序列化时的对象,所以在反序列化的时候需要引用原来的对象,这也解释了,为什么序列化的时候,不需要序列化方法,属性,只需要把保存状态信息的东西序列化。如:数据-》字段的值

    序列化的对象中的属性,方法,反序列化后会自动生成。

     1             Person p = new Person()
     2             {
     3                 _name = "saf",
     4                 _age = 19,
     5                 _email = "yahoo@sina.com",
     6                 _height = 32
     7             };
     8 
     9             BinaryFormatter binarySerializer = new BinaryFormatter();
    10             using (FileStream fs = new FileStream("person.bin",FileMode.Create))
    11             {
    12                 binarySerializer.Serialize(fs,p);
    13             }
    14             Console.WriteLine("ok");
    View Code

    反序列化的代码如下:

    1  using (FileStream fs = new FileStream("person.bin", FileMode.Open))
    2             {
    3                 BinaryFormatter bf = new BinaryFormatter();
    4                 object obj= bf.Deserialize(fs);
    5 
    6               
    7                 Person p = obj as Person;
    8                 Console.WriteLine(p._height+"  "+p._age+"   "+p._name);
    9             }
    View Code
  • 相关阅读:
    关于spring security的若干事情
    .net2005 datagridview 如何获取值改变的单元格的集合??(小弟没有为datagridview添加数据源,也就是说单元格中的数据是手工录入的)
    关于做一个通用打印类的设想,大家谈谈看法
    请教C#,两个类中的变量互访问题
    刚发现了一个问题,关于vs2005 datagridview的,我发现在设计行标头的HeaderCell.Value的时候要是设置RowTemplate.Height 的值>= 17则行标头的那个黑三角就显示出来了,要是小于17就不能显示了,想问问大家,是怎么回事?
    软件架构模式基本概念及三者区别
    以英雄联盟的方式建模,谈对依赖注入(DI)的理解以及Autofac的用法(一)
    适配器模式
    [翻译] WCF运行时架构
    关于synchronized 影响可见性的问题
  • 原文地址:https://www.cnblogs.com/wesley168/p/6636327.html
Copyright © 2011-2022 走看看