序列化又称串行化,是.NET运行时环境用来支持用户定义类型的流化的机制。其目的是以某种存储造成使自定义对象持久化,或者将这种对象从一个地方传输到另外一个地方。
.NET框架提供了两种串行化的方式:一、是使用BinaryFormatter进行串行化;二、使用SoapFormatter进行串行化;三、使用XmlSerializer进行串行化。第一种方式提供了一个简单的二进制数据流以及某些附加的类型信息,而第二种将数据流格式化为XML存储;第三种其实和第二种差很少也是XML的格式存储,只不过比第二种的XML格式要简化不少(去掉了SOAP特有的额外信息)。
可使用[Serializable]属性将类标志为可序列化的。若是某个类的元素不想被序列化,一、2可使用[NonSerialized]属性来标志,二、可使用[XmlIgnore]来标志。
一、使用BinaryFormatter进行串行化
下面是一个可串行化的类:
框架
下面是串行化和反串行化的方法:
函数
调用上述两个方法就能够看到串行化的结果:Sex属性由于被标志为[NonSerialized],故其值老是为null。
二、使用SoapFormatter进行串行化
和BinaryFormatter相似,咱们只须要作一下简单修改便可:
a.将using语句中的.Formatter.Binary改成.Formatter.Soap;
b.将全部的BinaryFormatter替换为SoapFormatter.
c.确保报存文件的扩展名为.xml
通过上面简单改动,便可实现SoapFormatter的串行化,这时候产生的文件就是一个xml格式的文件。
三、使用XmlSerializer进行串行化
关于格式化器还有一个问题,假设咱们须要XML,可是不想要SOAP特有的额外信息,那么咱们应该怎么办呢?有两中方案:要么编写一个实现IFormatter接口的类,采用的方式相似于SoapFormatter类,可是没有你不须要的信息;要么使用库类XmlSerializer,这个类不使用Serializable属性,可是它提供了相似的功能。
若是咱们不想使用主流的串行化机制,而想使用XmlSeralizer进行串行化咱们须要作一下修改:
a.添加System.Xml.Serialization命名空间。
b.Serializable和NoSerialized属性将被忽略,而是使用XmlIgnore属性,它的行为与NoSerialized相似。
c.XmlSeralizer要求类有个默认的构造器,这个条件可能已经知足了。
下面看示例:
要序列化的类:
工具
序列化和反序列化方法:学习
这里Course类的Description属性值将始终为null,生成的xml文档中也没有该节点,以下图:spa
四、自定义序列化
若是你但愿让用户对类进行串行化,可是对数据流的组织方式不彻底满意,那么能够经过在自定义类中实现接口来自定义串行化行为。这个接口只有一个方法,GetObjectData. 这个方法用于将对类对象进行串行化所须要的数据填进SerializationInfo对象。你使用的格式化器将构造SerializationInfo对象,而后在串行化时调用GetObjectData. 若是类的父类也实现了ISerializable,那么应该调用GetObjectData的父类实现。
若是你实现了ISerializable,那么还必须提供一个具备特定原型的构造器,这个构造器的参数列表必须与GetObjectData相同。这个构造器应该被声明为私有的或受保护的,以防止粗心的开发人员直接使用它。
示例以下:
实现ISerializable的类:
orm
序列化和反序列化方法:xml
PS:本文章属我的学习总结,部份内容参考互联网上的相关文章。 其中若是发现我的总结有不正确的认知或遗漏的地方请评论告知,欢迎交流。对象