.Net 序列化中 版本兼容问题
如果你试图反序列化一个早期版本的对象,将有可能出现版本兼容问题, 例如,你添加了一个成员到你自定义类中,当你反序列化早期版本时,就会抛出一个异常(.Net framework1.0或者1.1时). 在这种情况下通常有2中解决办法:
1. 在序列化新版本的自定义类时,导入旧版本的自定义类。
2. 标识新添加的成员为OptionalField.
OptionalFied属性并不会影响对象序列化过程,当在反序列化时,CLR碰见OptionalFiled属性时,就会自动赋NULL值给改成员而不是抛出异常.例如:
[Serializable]
class ShoppingCartItem : IDeserializationCallback
{
public int productId;
public decimal price;
public int quantity;
[NonSerialized]
public decimal total;
[OptionalField]
public bool taxable;
}
class ShoppingCartItem : IDeserializationCallback
{
public int productId;
public decimal price;
public int quantity;
[NonSerialized]
public decimal total;
[OptionalField]
public bool taxable;
}
所以建议:
1. 不要移除标识有[serialized]属性的字段
2. 不要标识[NonSerilized]属性给字段,如果该字段在早期版本中被序列化
3. 不要改变成员的类型或名字
4. 当添加一个新的序列化成员时,需要标识为[OptionalField].
5. 当你希望移除[NonSerilized]属性时,建议用[OptionalField]代替
6. 对于你标识为[OptionalField]字段,如果你希望在反序列化中初始化该成员,你可以实现IDeserializationCallback接口并实现OnDeserialization方法. 除非你只需要赋值为0或者NULL.