小言_互联网的博客

C#学习笔记25-序列化和反序列化

436人阅读  评论(0)

C#学习笔记25-序列化和反序列化

序列化

序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程,序列把对象转换成有序字节流,以便在网络上传输或者保存在本地文件中

序列化的主要目的有三个:
1)以某种存储形式使自定义对象持久化;
2)将对象从一个地方传递到另一个地方;
3)使程序更具维护。

对于需要序列化的对象,需要在类前面声明[Serializable],表示其可序列化,其语法格式如下所示:

   [Serializable]//表示类可以序列化
    public class Person
    {
        string _name;
        public string Name { get => _name; set => _name = value; }
        public string Gender { get => _gender; set => _gender = value; }

        string _gender;

    }

反序列化

反序列化指把字节序列恢复为对象的过程,即将二进制转化为对象,客户端从文件中或网络上获得序列化后的对象字节流后,根据字节流中所保存的对象状态及描述信息,通过反序列化重建对象

序列化和反序列化的过程如下所示:

 static void Main(string[] args)
        {
            //要将p1这个对象,传输给对方电脑
            Person p1 = new Person();
            p1.Name = "张三";
            p1.Gender = "男";
            using (FileStream fsWrite = new FileStream(@"C:\Users\91134\Desktop\new.txt", FileMode.OpenOrCreate, FileAccess.Write))
            {
                //开始序列化对象
                BinaryFormatter bf = new BinaryFormatter();
                bf.Serialize(fsWrite, p1);
            }
            Console.WriteLine("序列化成功");


            //接受对方发送过来的二进制 反序列化成对象
            Person p;
            using (FileStream fsRead = new FileStream(@"C:\Users\91134\Desktop\new.txt", FileMode.OpenOrCreate, FileAccess.Read))
            {
                BinaryFormatter bf1 = new BinaryFormatter();
                p=(Person) bf1.Deserialize(fsRead);
            }
            Console.WriteLine("反序列化成功");
            Console.WriteLine(p.Name);
            Console.WriteLine(p.Gender);

                
            Console.ReadKey();
        }

序列化与反序列化重要是利用Serialize、Deserialize两个方法,而在.net framework的类库中提供了三个可以用于序列化和反序列化的类,分别为BinaryFormatter、SoapFormatter和XmlSerializer,这三种类对象都可调用序列化和反序列的方法进行操作。

BinaryFormatter可以对单个对象,或集合对象(如List、ObservableCollection)进行序列化。
需要指出的是,需要对被序列化的对象添加[Serializable]特性,也就是我们上述提到的格式

XmlSerializer,无论对于单个对象还是集合对象(如List、ObservableCollection),都可以使用XmlSerializer进行序列化。需要指出的是,不需要对被序列化的对象添加[Serializable]特性注解。但是,使用XmlSeriabizable的时候,被序列化的对象应该具有无参数构造函数

而SoapFormatter现在基本被淘汰,不被使用了,用法与BinaryFormatter类似

总结

序列化步骤:

1.得到一个存储对象的类型

2.创建一个写入文件流

3.定义要序列化的类型

4.调用序列化方法
  
反序列化步骤:

1.定义一个装载对象的类型

2.创建一个读出文件流

3.定义要反序列化的类型

4.调用反序列化方法

二进制序列化的优点:

1. 所有的类成员(包括只读的)都可以被序列化;

2. 性能非常好。

XML序列化的优点:

1. 互操作性好;

2. 不需要严格的二进制依赖;

3. 可读性强

参考链接

1、c# 序列化BinaryFormatter、SoapFormatter和XmlSerializer的区别

2、序列化和反序列化

--------------------------------------以上内容由作者原创,欢迎转载,部分从网络整理,如侵权清联系删除----------------------------------------------


转载:https://blog.csdn.net/weixin_44985601/article/details/104763558
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场