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

      对象序列化:是将对象转换为二进制数据

      反序列化:是将二进制数据还原为对象。

      对象是稍纵即逝的,不仅程序重启、操作系统重启会造成对象的消失,就是退出函数范围范围等都可能造成对象的消失,序列化/反序列化就是为了保持对象持久化

      对象序列化,只能针对对象的字段进行序列化。

    BinaryFormatter类有两个方法:

      • void Serialize(Stream stream,object graph) 对象graph序列化到stream中

      • object Deserialize(Stream stream) 将对象从stream中反序列化,返回值为反序列化得到的对象。

    注:不是所有对象都能序列化,只有可序列化的对象才能序列化,在类的声明上加[Serializable],对象的属性、字段的类型也必须可序列化

    一、序列化

    json序列化

     1     class Program
     2     {
     3         static void Main(string[] args)
     4         {
     5             Person p1 = new Person();
     6             p1.Name = "Alex";
     7             p1.Age = 19;
     8             p1.Email = "Alex@163.com";
     9             //需引用 System.web.Extensions
    10             //命名空间 using System.Web.Script.Serialization;
    11             JavaScriptSerializer jsSer = new JavaScriptSerializer();
    12             string msg = jsSer.Serialize(p1);
    13             Console.WriteLine(msg);
    14             Console.ReadKey();
    15         }
    16     }
    17     public class Person
    18     {
    19         public string Name { get; set; }
    20         public int Age { get; set; }
    21         public string Email { get; set; }
    22     }

     xml序列化

     1     class Program
     2     {
     3         static void Main(string[] args)
     4         {
     5             Person p1 = new Person();
     6             p1.Name = "Alex";
     7             p1.Age = 19;
     8             p1.Email = "Alex@163.com";
     9 
    10             //需引用 System.web.Extensions
    11             //命名空间 using System.Xml.Serialization;
    12             XmlSerializer xml = new XmlSerializer(typeof(Person));
    13             using (FileStream fs=new FileStream("Person.xml",FileMode.Create))
    14             {
    15                 xml.Serialize(fs,p1);
    16             }
    17             Console.WriteLine("ok");
    18             Console.ReadKey();
    19         }
    20     }
    21     public class Person
    22     {
    23         public string Name { get; set; }
    24         public int Age { get; set; }
    25         public string Email { get; set; }
    26     }

     二进制序列化

     1     class Program
     2     {
     3         static void Main(string[] args)
     4         {
     5             Person p1 = new Person();
     6             p1.Name = "Alex";
     7             p1.Age = 19;
     8             p1.Email = "Alex@163.com";
     9             //二进制序列化注意点:
    10             //1、被序列化的对象的类型必须标记为“可序列化” -->[Serializable]
    11 
    12             //二进制序列化步骤
    13             //1、创建序列化器
    14             BinaryFormatter bf = new BinaryFormatter(); //命名空间 using System.Runtime.Serialization.Formatters.Binary;
    15             //1.1、创建一个文件流
    16             using (FileStream fs = new FileStream("person.bin",FileMode.Create))
    17             {
    18                 //2、开始执行序列化
    19                 bf.Serialize(fs, p1);
    20             }
    21             Console.WriteLine("ok");
    22             Console.ReadKey();
    23         }
    24     }
    25     // 注意:二进制序列化,必须标记为:[Serializable]
    26     [Serializable]
    27     public class Person
    28     {
    29         public string Name { get; set; }
    30         public int Age { get; set; }
    31         public string Email { get; set; }
    32         public void Say()
    33         {
    34             Console.WriteLine("ok1");
    35         }
    36     }
     1     class Program
     2     {
     3         static void Main(string[] args)
     4         {
     5             Person p1 = new Person();
     6             p1.Name = "Alex";
     7             p1.Age = 19;
     8             p1.Email = "Alex@163.com";
     9             p1.BenChi = new Car();
    10             //二进制序列化注意点:
    11             //1、被序列化的对象的类型必须标记为“可序列化” -->[Serializable]
    12             //2、被序列化的类的所有弗雷必须标记为“可序列化”
    13             //3、要求被序列化的对象的类型中的所有字段的类型也必须标记为“可序列化”
    14 
    15             //二进制序列化步骤
    16             //1、创建序列化器
    17             BinaryFormatter bf = new BinaryFormatter(); //命名空间 using System.Runtime.Serialization.Formatters.Binary;
    18             //1.1、创建一个文件流
    19             using (FileStream fs = new FileStream("person.bin",FileMode.Create))
    20             {
    21                 //2、开始执行序列化
    22                 bf.Serialize(fs, p1);
    23             }
    24             Console.WriteLine("ok");
    25             Console.ReadKey();
    26         }
    27     }
    28     [Serializable]
    29     public class Animal
    30     {
    31         public void Eat()
    32         {
    33             Console.WriteLine("吃东西。");
    34         }
    35     }
    36     // 注意:二进制序列化,必须标记为:[Serializable]
    37     [Serializable]
    38     public class Person:Animal
    39     {
    40         public Car BenChi { get; set; }
    41         public string Name { get; set; }
    42         public int Age { get; set; }
    43         public string Email { get; set; }
    44 
    45         public void Say()
    46         {
    47             Console.WriteLine("ok1");
    48         }
    49     }
    50     [Serializable]
    51     public class Car
    52     {
    53 
    54     }
    二进制补充

     补充:

    在字段属性前加[NonSerialized]不被序列化

     1         [NonSerialized]
     2         private string _name;
     3         public string name
     4         {
     5             get
     6             {
     7                 return _name;
     8             }
     9             set
    10             {
    11                 _name = value;
    12             }
    13         }

     二、反序列化

    二进制反序列化:需引用序列化的dll

    注:反序列化要根据序列化文件重新还原该对象,而序列化文件中只包含那些数据信息,并不包含该对象的类型相关的信息,比如:该对象是继承自那个父类,实现了哪些接口,类型中包含哪些方法。。。这些信息在对象序列化文件中都不包含,要获取这些信息必须通过该类型的程序集来获取。

     1     class Program
     2     {
     3         static void Main(string[] args)
     4         {
     5             // 命名空间 using System.Runtime.Serialization.Formatters.Binary;
     6             // 命名空间 using System.IO;
     7             //1、创建序列化器
     8             BinaryFormatter bf = new BinaryFormatter();
     9             //1.1、创建读取文件的文件流
    10             using (FileStream fs=new FileStream("person.bin", FileMode.Open))
    11             {
    12                 //2、执行反序列化
    13                 object obj = bf.Deserialize(fs);
    14                 Person p1 = obj as Person;
    15                 Console.WriteLine(p1.Name);
    16                 Console.WriteLine(p1.Age);
    17                 Console.WriteLine(p1.Email);
    18             }
    19             Console.WriteLine("ok");
    20             Console.ReadKey();
    21         }
    22     }

  • 相关阅读:
    codevs 3641 上帝选人
    codevs 1966 乘法游戏
    codevs 1345 饥饿的奶牛
    codevs 1962 马棚问题--序列型DP
    codevs 1959 拔河比赛--判断背包内刚好装满n/2个物品
    codevs 1297 硬币
    [转载]矩阵取数游戏
    101.金明的预算方案(分组背包)
    105.(并查集结合绝对值最小的01背包)选学霸
    POJ 2528 Mayor's posters(线段树)
  • 原文地址:https://www.cnblogs.com/chenyanbin/p/11052350.html
Copyright © 2011-2022 走看看