嘿嘿,不论发生什么的情况,学校没有老师上课也好,我们都要自己主动地学习啦,学习是不能落下的啦,虽然我们这周没有老师给我们上课,但是我们只有自己学习啦,还记得前几天,老是简单的说啦下序列化,那时间也只是简单的听啦一下大概的内容,只知道需要一个关键字啦,今天没有上课也就没有什么新的知识总结啦,那么我就自己寻找些自己想知道的啦,下面详细的总结下序列化与反序列化啦。
一.序列化
序列化:就是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。
序列化的应用:将对象持久化存储,磁盘、数据库;将对象复制到剪贴板;将对象通过网络传输;将对象备份(深拷贝。)
序列化的命名空间:using System.Runtime.Serialization.Formatters.Binary;
下面就先使用List泛型举例简单的说一下:
List<int> list = new List<int>(); //list泛型 list.Add(1); list.Add(2); list.Add(3); using (FileStream fs = new FileStream("data.txt", FileMode.Create)) //当创建文件时间使用Create { BinaryFormatter bf = new BinaryFormatter(); bf.Serialize(fs, list); //在这里就是序列化的方法,把对象转化成二进制的形式通过流保存在文件中 }
if (File.Exists("data.txt")) //当反序列化时间首先判断文件是否存在 using (FileStream fs = new FileStream("data.txt", FileMode.Open)) { BinaryFormatter bf = new BinaryFormatter(); List<int> list = bf.Deserialize(fs) as List<int>; //在这里需要注意,我们序列化进去的是一个什么类型,那么我们反序列回来的就是什么类型,而bf.Deserialize(fs)返回的本是一个object类型,所以转换为list<int>类型 //通过流读文件把流中的内容反序列化成对象 for (int i = 0; i < list.Count; i++) { Console.WriteLine(list[i]); //遍历出每一项 } }
这里就是我们反序列化的创建啦,我们可以看到上面的第一行代码,在这里我们要注意啦,在反序列化前,一定要判断我们序列化的文件是否存在,在存在的情况下,我们可以反序列化啦,我们序列化时间使用的方法是Serialize,而在反序列化时间调用的是Deserialize方法,还有我们在反序列化时间要注意类型的转化啦,这个是非常重要的啦。
下面就写一个自己定义的类,在这个类中可以有继承,然后让其序列化与反序列化啦。
首先定义一个Student类,在定义一个Person类与Dog类,Person为父类,Student为子类,继承父类Person类,而Dog仅仅为Student的一个属性,下面让其序列化与反序列化一下。
[Serializable] class Person { private int age; public int Age { get { return age; } set { age = value; } } }
[Serializable] class Student :Person { private string name; public string Name { get { return name; } set { name = value; } } private Dog dog; internal Dog Dog { get { return dog; } set { dog = value; } } public void SayHi() { Console.WriteLine(this.name); } }
[Serializable] class Dog { private string name; public string Name { get { return name; } set { name = value; } } } }
上面是定义的三个类,实现了继承方法,在这里需要注意的是:序列化不会通过继承关系而继承,因此,当无论是Student类还是Person任何一个类要序列化,那么他们都要序列化,而Student中的属性类在这里也是必须实现可序列化的,这里是容易出错的地方,我们要更加的注意的啦。
下面就写一下实现序列化和反序列化的方法,
#region 自定义一个可序列化的类 Student s = new Student(); s.Name = "zhangsan"; s.Dog = new Dog(); //在这里是因为定义啦一个Dog的类,而把Dog这个类作为Student的其中一个属性 s.Dog.Name = "xiaogou"; using (FileStream fs = new FileStream("a.txt", FileMode.Create)) { BinaryFormatter bf = new BinaryFormatter(); bf.Serialize(fs, s); } #endregion
#region 自定义反序列化 if (File.Exists("a.txt")) { using (FileStream fs = new FileStream("a.txt", FileMode.Open)) { BinaryFormatter bf = new BinaryFormatter(); Student s= bf.Deserialize(fs) as Student; s.Dog.Name = "xiaogou"; s.SayHi(); Console.WriteLine(s.Dog.Name); } } #endregion
通过上面的方法对比,一个是系统定义好的List类,一个是我们自己定义的可序列化的Person,Student与Student的属性Dog类,而他们要实现序列化的方法都是要添加一个可序列化的标识,仅此而已,我们在实现序列化时间一定要注意添加标识即可,然后即可实现其序列化与反序列化。
嘿嘿,我终于知道啦序列化与反序列化啦,虽然仅仅认识啦而已,但是还是蛮高兴的啦,据说序列化好难得啊,但是这还是简单的初步认识而已,我还是会继续学习这个的啦,嘿嘿,努力喽。