论序列化与反序列化
首先给大家介绍一下序列化是用来干什么的,他为什么出现
序列化这种技术说到底其实就是把临时数据保存在电脑上。大家都知道对于程序而言对象是一种稍纵即逝的数据,不仅仅是程序重启、电脑重启,就连内部函数的变化也有可能导致对象的消失,但是总有一些对象是大家不想让其随意消失的并且想在下一次开启程序的时候进行加载,在这种环境下-序列化便出现了,它的意义就是为了保持对象的持久化
在此我为大家介绍一下c#当中的xml序列化和二进制序列化,基本所有序列化的方式都差不多因此就着重介绍这两种比较常用的序列化方式
假设类名为:person 对象名为:p
一: xml序列化
第一步当然是引入命名空间:using system.io; using system.xml.serialization;
先实例化我们的类-xmlserializer
xmlserializer xml = new xmlserializer(typeof(person));
实例化类时的参数为一个type类型,利用typeof就可以了,typeof里面传入类名
创建出对象xml后开始创filestream的对象
filestream fs = new filestream("asd.xml",filemode.openorcreate);
实例化该类时传入的参数有两个,第一个是你为文件起的名字-string,第二个是你对io的操作、一般默认为filemode.openorcreat
然后就是序列化了~ 方法-serialize
xml.serialize(fs,p);
用serialize这个方法的两个参数分别是实例化filestream的对象名-fs 以及你想要保存的对象的名-p
完成这个方法后,我们的xml序列化就结束了~
我们想要反序列化的话也简单,就是最后调用的方法不一样,在此用方法-doserialize
object obj = xml.doserialize(fs);
用这个方法只要传入实例化filestream的对象名-fs 就可以了,他有一个object类型的返回值,接受它,然后把它强转为你需要的类型就ok了
二:二进制序列化
二进制序列化和xml序列化的架构差不多
首先也是引入命名空间:using system.io;
using system.runtime.senalization.formatter.binary;
先实例化我们的类-binaryformatter
binaryformatter bin = new binaryformatter();
此类实例化时不用参数哦~
然后创filestream的对象
filestream fs = new filestream("asd.xml",filemode.openorcreate);
实例化该类时传入的参数有两个,第一个是你为文件起的名字-string,第二个是你对io的操作、一般默认为filemode.openorcreat
然后就是序列化了~ 方法-serialize
bin.serialize(fs,p);
用serialize这个方法的两个参数分别是实例化filestream的对象名-fs 以及你想要保存的对象的名-p
完成这个方法后,我们的二进制序列化就结束了~
object obj = bin.doserialize(fs);
用这个方法只要传入实例化filestream的对象名-fs 就可以了,他有一个object类型的返回值,接受它,然后把它强转为你需要的类型就ok了
虽然两者大部分都是一致的,但是二进制序列化的要求更加多,如下:
1)要进行序列化的类型、类型的父类以及类型中的所有成员的类型都统统要求标记为:
[serializable]
2) 二进制序列化只能对类中的字段进行序列化,如果有一些字段不想让其序列化只要标记为:
[nonserialized]