创建对象的序列化文件 SoapFormatter,binaryFormatter以及XmlSerializer序列化文件的比较

序列化本身就是要将对象转换成为数据流, 这样便于存储和传输.

SoapFormatter和binaryFormatter都是一种Formatter,原本我以为XmlSerializer也是继承了IFormatter接口,后来发现不是.

关于formatter和Iformatter,可以到命名空间 System.Runtime.Serialization.Formatters 查看

关于使用比较

// create a file stream to write the file
FileStream fileStream = new FileStream("DoSum.bin", FileMode.Create);
// use the CLR binary formatter
BinaryFormatter binaryFormatter = new BinaryFormatter();
// serialize to disk
binaryFormatter.Serialize(fileStream, sObj);
fileStream.Close();

xmlSerializer 比较不同

// create a file stream to write the file
            FileStream fileStream = new FileStream("DoSum.xml", FileMode.Create);
            // use the CLR binary formatter
            System.Xml.Serialization.XmlSerializer
                formatter = new XmlSerializer(typeof(SumOf));
            // serialize to disk
            formatter.Serialize(fileStream, sObj);
            fileStream.Close();

 

可以使用(定义)不同的格式器来创建对象的序列化.

比如 SoapFormatter, binaryFormatter

当然也可以完全继承一个Formatter来定义自己的格式化器.

SoapFormatter, binaryFormatter 是无法继承的,它们是实现了 IFormatter接口, 而xmlSerializer没有实现接口IFormatter,但我们可以定义类继承于它

序列化导出内容的不同.

如果我们想控制序列化出来的内容,我们有两个途径来控制, 一个是定义自己的格式化器,另一个则是被序列化对象实现接口 System.Runtime.Serialization.ISerializable.

格式化器里面有一个方法:

public override void Serialize(System.IO.Stream serializationStream, object graph)

ISerializable 里面有一个方法:

public void GetObjectData(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context)

需要注意的是, 尽管对象实现了ISerializable, 如果使用xmlSerializer导出内容仍然不变.

注意以下文字

序列化过程的步骤
在格式化程序上调用 serialize 方法时,对象序列化按照以下规则进行:
检查格式化程序是否有代理选取器。如果有,检查代理选取器是否处理指定类型的对象。如果选取器处理此对象类型,将在代理选取器上调用 iserializable.getobjectdata。
如果没有代理选取器或有却不处理此类型,将检查是否使用 serializable 属性对对象进行标记。如果未标记,将会引发 serializationexception。
如果对象已被正确标记,将检查对象是否实现了 iserializable。如果已实现,将在对象上调用 getobjectdata。
如果对象未实现 serializable,将使用默认的序列化策略,对所有未标记为 nonserialized 的字段都进行序列化。

 

关于对象序列化,可以在网上搜索一下这篇文章<<.NET 中的对象序列化>>

我这里有一个问题, 最近传送一个dataset的时候,我直接使用的 datatset.getxml()获取的序列文件,是否可以自己定义一个formatter来序列它呢?

原文地址:https://www.cnblogs.com/king_astar/p/900394.html