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);
    }
}