反序列化时仅未设置属性的默认值

Chr*_*fer 3 .net c# serialization winforms

我有一个小问题,我猜应该从一开始就应该通过更好的代码设计来解决。但我在这里。

我有一个用户群相当大的应用程序。该应用程序使用配置文件。启动应用程序时,配置文件从文件中反序列化。

在新版本中,配置文件类有时会获得新属性。如果配置文件是从旧版本反序列化的,则这些属性将未初始化。如果配置文件是使用当前版本的应用程序创建的,那么它们将具有一些设置的默认值。

如果序列化版本没有,是否有一种简单的方法可以用默认值初始化属性?

Ňɏs*_*arp 5

您可以指定在反序列化后运行的方法,您可以在其中设置默认值:

using System.Runtime.Serialization;

[Serializable]
class Car
{
    public int Id { get; set; }
    public string Make { get; set; }
    public int Doors { get; set; }

    public string Foo { get; set; }    // added property

    ...
    [OnDeserialized()]
    internal void OnDeserializedMethod(StreamingContext context)
    {
        if (string.IsNullOrEmpty(this.Foo))
            this.Foo = "Ziggy";
    }
}
Run Code Online (Sandbox Code Playgroud)

您可能需要考虑 ProtoBuf-NET,它是一个数据契约二进制序列化程序。它在这些方面更加灵活、更多选择、更快并产生更小的输出。我只是仔细检查以确保,ProtoBuf 不会撤消它没有信息的字段。所以:

[ProtoContract]
class Car
{
    [ProtoMember(1)]
    public int Id { get; set; }
    [ProtoMember(2)]
    public string Make { get; set; }
    [ProtoMember(3)]
    public int Doors { get; set; }
    [ProtoMember(4)]
    public string Foo { get; set; }      // new prop

    public Car()
    {
        this.Foo = "Ziggy";
    }
    ...
 }
Run Code Online (Sandbox Code Playgroud)

如果 没有序列化值Foo,则保留来自 ctor 的旧值。因此,您可以在那里初始化新属性,而不必担心它们会被重置为 null。如果您有很多类似 的属性BitmapFont并且Rectangle您可能希望继续使用BinaryFormatter.