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
  • 相关阅读:
    Bootstrap-模态框Modal使用
    MVC Controller return 格式
    数据库水平拆分和垂直拆分区别(以mysql为例)
    MySQL 对于大表(千万级),要怎么优化呢?
    mysql优化案例
    Mysql大表查询优化技巧总结及案例分析
    Mysql Partition 理论知识总结
    mysql Partition(分区)初探
    MySQL partition分区I
    xapian安装
  • 原文地址:https://www.cnblogs.com/wesley168/p/6636327.html
Copyright © 2011-2022 走看看