如何在C#中覆盖反序列化

我有一个课程,随着时间的推移会经历一些版本的变化。 作为我的应用程序启动的一部分,来自此类内部的数据被序列化和反序列化。 我遇到的问题是,如果我通过添加更多属性来更新类,然后启动应用程序,旧数据将无法正确加载。
我想要做的是覆盖反序列化步骤,我不介意从xml手动重建对象,因为我有一个版本号存储,可以用它来递归更新对象的版本。

是否有我可以实现的接口,或者我可以在某处设置的属性,以便能够执行此操作?

如果你想不出办法做我想做的事,那还有其他选择吗? 例如我正在加载的xml版本中可能不存在的属性的默认值。

通常,对于版本控制,可以将OptionalField属性用于可能导致兼容性问题的新添加的成员。 在序列化期间,如果成员未被序列化,则会将成员值保留为null,而不是抛出exception。

另外,看看IDeserializationCallback.OnDeserialization接口,它允许您自定义反序列化。

实现IXmlSerializable接口 。

如果它是xml-serialization特别是你在谈论你应该实现IXmlSerializable接口。 如果是二进制序列化,您只需使用OptionalField属性标记新成员即可。

你可以在这里阅读更多: http : //msdn.microsoft.com/en-us/library/ms229752(VS.80).aspx

您可以实现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); } }