Effective C# 原则25: 让你的类型支持序列化
2009-02-19 08:16:24 来源:WEB开发网到目前为止,你已经知道为什么要为所有类型添加序列化了:非序列化类型会在要序列化的对象中使用时带来更多的麻烦事。你也学会了用特性来实现最简单的序列化方法,还包括如何初始化非序列化成员。
序列化了对象有方法在程序的不同版本间生存。(译注:这是一个很重要的问题,因为.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()方法,这是用于写数据到流中。另外,如果你必须提供一个序列析构函数从流中初始化对象:
- ››Effective C# 原则40:根据需求选择集合
- ››Effective C# 原则41:选择DataSet而不是自定义的...
- ››Effective C# 原则42:使用特性进行简单的反射
- ››Effective C# 原则43:请勿滥用反射
- ››Effective C# 原则44:创建应用程序特定的异常类
- ››Effective C# 第6章:杂项
- ››Effective C# 原则45:选择强异常来保护程序
- ››Effective C# 原则47:选择安全的代码
- ››Effective C# 原则48:了解更多的工具和资源
- ››Effective C# 原则49:为C#2.0做好准备
- ››Effective C# 原则50:了解ECMA标准
- ››Effective C# 原则系列文章目录
更多精彩
赞助商链接