C# 如何在C中重写反序列化#
我有一个类,随着时间的推移会经历某些版本的更改。 作为应用程序启动的一部分,此类内部的数据被序列化和反序列化。我的问题是,如果我通过添加更多属性来更新类,然后启动应用程序,则旧数据无法正确加载。C# 如何在C中重写反序列化#,c#,xml,serialization,xml-serialization,persistence,C#,Xml,Serialization,Xml Serialization,Persistence,我有一个类,随着时间的推移会经历某些版本的更改。 作为应用程序启动的一部分,此类内部的数据被序列化和反序列化。我的问题是,如果我通过添加更多属性来更新类,然后启动应用程序,则旧数据无法正确加载。 我想做的是重写反序列化步骤,我不介意从xml手动重建对象,因为我存储了一个版本号,可以使用它递归地更新对象的版本 是否有一个我可以实现的接口,或者我可以在某个地方设置一个属性来实现这一点 如果你想不出一个方法来做我想做的事,有其他的选择吗?例如,我正在加载的xml版本中可能不存在的属性的默认值。实现。如
我想做的是重写反序列化步骤,我不介意从xml手动重建对象,因为我存储了一个版本号,可以使用它递归地更新对象的版本 是否有一个我可以实现的接口,或者我可以在某个地方设置一个属性来实现这一点
如果你想不出一个方法来做我想做的事,有其他的选择吗?例如,我正在加载的xml版本中可能不存在的属性的默认值。实现。如果您具体谈论的是xml序列化,则应该实现IXmlSerializable接口。如果是二进制序列化,您可以使用OptionalField属性标记新成员
您可以在此处阅读更多内容:通常对于版本控制,您可以对可能导致兼容性问题的新添加成员使用
OptionalField
属性。在序列化期间,如果未序列化成员,则会将成员值保留为null,而不是引发异常
另外,请看一下IDeserializationCallback.OnDeserialization
接口,该接口允许您自定义反序列化。您可以实现该接口,并提供一个构造函数,该构造函数接受和一个对象,以获得对序列化/反序列化过程的精细控制
例如:
[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);
}
}