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

时间:2016-06-11 17:27:00

标签: c# .net winforms serialization

我有一点问题,我猜测应该从一开始就用更好的代码设计解决。但我在这里。

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

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

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

1 个答案:

答案 0 :(得分:3)

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

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

您可能需要考虑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";
    }
    ...
 }

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