我有一点问题,我猜测应该从一开始就用更好的代码设计解决。但我在这里。
我的应用程序拥有相当大的用户群。该应用使用配置文件。启动应用程序时,会从文件中反序列化配置文件。
在新版本中,配置文件类有时会获得新属性。如果从旧版本反序列化配置文件,则这些属性将是未初始化的。如果使用当前版本的应用程序创建配置文件,它们将具有一些设置默认值。
如果序列化版本没有默认值,是否有一种简单的初始化属性的方法?
答案 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。如果您有很多属性,例如Bitmap
,Font
和Rectangle
,您可能希望继续使用BinaryFormatter
。