Effective C# Item 25: Prefer Serializable Type
在我们创建自己的类型时,有些基本的特性是容易被忽略的,例如可序列化。如果我们的类型不支持可序列化属性,那么对于使用这些类型的开发人员来说可能需要为此付出一些不必要的工作。如果我们的类型不支持序列化,那么对于使用者来说,想要将其修改为支持序列化是非常困难或者根本不可能做到的。
我们应当尽量让我们的自定义类型支持序列化。在.Net中做到这一点是很容易的,大部分情况下只需要添加一个Serializable属性就足够了:
[Serializable]
public class MyType

{
private string _label;
private int _value;
}上例中Serializable属性起作用的原因是类型中的所有成员也都是可序列化类型:string和int都支持序列化。对于下例来说:
[Serializable]
public class MyType

{
private string _label;
private int _value;
private OtherClass _object;
}Serializable属性能否起作用取决于OtherClass是否支持序列化。如果它不支持的化我们就会在运行时遇到错误。为此我们就必须编写自己的代码来序列化这个类。这一工作对于不了解OtherClass内部定义的用户来说,基本是不可能做到的。
.Net序列化将对象中的所有成员变量输出到流中。另外它还支持任意的对象图形:即便是包含循环引用,serialize和deserialize方法都可以保存和复原每一个对象。另外Serializable属性支持二进制和Xml两种序列化方法。
一般来说添加Serializable属性是最简单的支持序列化的方法。但是有些时候这并不是最好的解决方法。例如有时候我并不希望序列化对象中的每一个成员。我们同样可以通过添加属性来解决这个问题。为成员添加[NonSerialized]属性就可以避免它保存在序列化对象中:
[Serializable]
public class MyType

{
private string _label;
[NonSerialized]
private int _cachedValue;
private OtherClass _object;
}
当我们反序列化时,这些非序列化对象将不被序列化API初始化。这些被标注[NonSerialized]的成员被初始化为系统默认初始化值:0或者null。如果我们希望修改这些默认的初始值,就需要实现IDeserial
