我有一个类,将在一段时间内进行某些版本更改。
这个类的数据会作为应用程序启动的一部分进行序列化和反序列化。我的问题是,如果我通过添加更多属性来更新这个类,然后启动应用程序,旧数据就无法正确加载。
我希望覆盖反序列化步骤,手动从XML重构对象是可以接受的,因为我存储了一个版本号,并可以使用它来递归更新对象的版本。
是否有我可以实现的接口或者可以设置的属性来实现这个功能?
如果您想不到实现我想要的方法,是否有替代方案?例如针对可能不存在于我正在加载的XML版本中的属性设置默认值。
通常情况下,为了进行版本控制,您可以使用OptionalField
属性来标记新添加的成员,这些成员可能会导致兼容性问题。在序列化期间,如果成员未被序列化,这将使成员的值为空而不是抛出异常。
此外,请查看IDeserializationCallback.OnDeserialization
接口,它允许您自定义反序列化过程。
您可以实现ISerializable接口,并提供一个构造函数,该构造函数接受SerializationInfo和StreamingContext对象,以获得对序列化/反序列化过程的精细控制。
例如:
[Serializable]
public struct MyStruct: ISerializable
{
private readonly int _x;
private readonly int _y;
// normal constructor
public MyStruct(int x, int y) : this()
{
_x = x;
_y = y;
}
// this constructor is used for deserialization
public MyStruct(SerializationInfo info, StreamingContext text) : this()
{
_x = info.GetInt32("X");
_y = info.GetInt32("Y");
}
public int X { get { return _x; } }
public int Y { get { return _y; } }
// this method is called during serialization
[SecurityPermission(SecurityAction.Demand, SerializationFormatter = true)]
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue("X", X);
info.AddValue("Z", Y);
}
}