C#中的序列化与反序列化

  先解释下概念:

    序列化就是把一个对象保存到一个文件或数据库字段中去,方便我们的存储与信息交换。反序列化就是在适当的时候把这个文件再转化成原来的对象使用。也可以说,序列化的目的就是为了跨进程传递格式化数据。当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把这个对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为对象。

    简单来说:

     把对象转换为字节序列的过程称为对象的序列化。
把字节序列恢复为对象的过程称为对象的反序列化。

     放代码:

     二进制序列化

namespace 序列化
{
   public class Program
    {
        static void Main(string[] args)
        {
          List<Person> list=new List< Person>();
          list.Add(new Person() { Name = "1", Age = 19 });
          list.Add(new Person() { Name = "2", Age = 29});
          list.Add(new Person() { Name = "3", Age = 16 });

          #region 二进制序列化
          BinaryFormatter bf=new BinaryFormatter();
            using(FileStream fsWrite=File.OpenWrite("1.bin"))
            {
                bf.Serialize(fsWrite,list);//序列化
                //bf.Deserialize();//反序列化
                Console.WriteLine("ok");
                Console.ReadKey();
            }
            #endregion
        }
        #region Person类
        public class Person
        {
            //三个属性
            public string Name { get; set; }
            public int Age { get; set; }
            public string Email { get; set; }
            //两个方法
            public void SayHi()
            {
                Console.WriteLine("我是:{0}", Name);
            }
            public void SayHello()
            {
                Console.WriteLine("Hello");
            }
        }
       #endregion
    }
}

        二进制序列化要求:
1.被序列化的对象的类型必须标记为可序列化的。
2.二进制序列化会把属性对应的字段序列化到文件中,类型中最好不要使用自动属性(编译器会自动生成字段),而要自己写属性与字段
3.当序列化一个对象的时候,这个对象本身以及的所有父类都必须标记为可序列化的。
4.类型中所有属性与字段的类型必须也标记为可序列化的。接口不需要。
5.通过[NonSerialized]把某个字段标记为不可序列化的。

    JavaScript序列化

 #region 使用JavaScript序列化

          //使用JavaScript序列化
          JavaScriptSerializer jsSerializer = new JavaScriptSerializer();
          string str = jsSerializer.Serialize(list);
           //jsSerializer.Deserialize();//反序列化
          File.WriteAllText("list.txt", str);
          Console.WriteLine(str);
          Console.ReadKey();

    使用XML序列化

//使用XML序列化
          XmlSerializer xmlSerializer = new XmlSerializer(list.GetType());//拿到type
            using(FileStream fsWrite=File.OpenWrite("1.xml"))
            {
                xmlSerializer.Serialize(fsWrite,list);
                //xmlSerializer.Deserialize();//反序列化
            }
            Console.WriteLine("ok");
            Console.ReadKey();
          #endregion

Written by

说点什么

欢迎讨论

avatar

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

  Subscribe  
提醒