Chr*_*fer 3 .net c# serialization winforms
我有一个小问题,我猜应该从一开始就应该通过更好的代码设计来解决。但我在这里。
我有一个用户群相当大的应用程序。该应用程序使用配置文件。启动应用程序时,配置文件从文件中反序列化。
在新版本中,配置文件类有时会获得新属性。如果配置文件是从旧版本反序列化的,则这些属性将未初始化。如果配置文件是使用当前版本的应用程序创建的,那么它们将具有一些设置的默认值。
如果序列化版本没有,是否有一种简单的方法可以用默认值初始化属性?
您可以指定在反序列化后运行的方法,您可以在其中设置默认值:
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。如果您有很多类似 的属性Bitmap,Font并且Rectangle您可能希望继续使用BinaryFormatter.
| 归档时间: |
|
| 查看次数: |
469 次 |
| 最近记录: |