WEB开发网
开发学院软件开发C语言 Effective C# 原则25: 让你的类型支持序列化 阅读

Effective C# 原则25: 让你的类型支持序列化

 2009-02-19 08:16:24 来源:WEB开发网   
核心提示: 到目前为止,你已经知道为什么要为所有类型添加序列化了:非序列化类型会在要序列化的对象中使用时带来更多的麻烦事,Effective C# 原则25: 让你的类型支持序列化(3),你也学会了用特性来实现最简单的序列化方法,还包括如何初始化非序列化成员,ISerializable定义了GetOb

到目前为止,你已经知道为什么要为所有类型添加序列化了:非序列化类型会在要序列化的对象中使用时带来更多的麻烦事。你也学会了用特性来实现最简单的序列化方法,还包括如何初始化非序列化成员。

序列化了对象有方法在程序的不同版本间生存。(译注:这是一个很重要的问题,因为.Net里的序列化不像C++那样,你可以轻松的自己控制每一个字节的数据,因此版本问题成了序列化中经常遇到的一个问题。) 添加序列化到一个类型上,就意味着有一天你要读取这个对象的早期版本。Serializable特性生成的代码,在对象图的成员被添加或者移除时会抛出异常。当你发现你自己已经要面对多版本问题时,你就需要在序列化过程中负出更多的操作:使用ISerializable接口。这个接口定义了一些hook用于自定义序列化你的类型。ISerializable接口里使用的方法和存储与默认的序列化方法和储存是一致的,这就是说,你可以使用序列化特性。如果什么时候有必要提供你自己的扩展序列化时,你可以再添加对ISerializable接口的支持。

做一个为例子:考虑你如何来支持MyType的第2个版本,也就是添加了另一个字段到类中时。简单的添加一个字段都会产生一个新的类型,而这与先前已经存在磁盘上的版本是不兼容的:

[Serializable]
public class MyType
{
 private string _label;
 [NonSerialized]
 private int _value;
 private OtherClass _object;
 // Added in version 2
 // The runtime throws Exceptions
 // with it finds this field missing in version 1.0
 // files.
 private int _value2;
}

你实现ISerializable接口来支持对这个行为的处理。ISerializable接口定义了一个方法,但你必需实现两个。ISerializable定义了GetObjectData()方法,这是用于写数据到流中。另外,如果你必须提供一个序列析构函数从流中初始化对象:

上一页  1 2 3 4 5 6  下一页

Tags:Effective 原则 类型

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接