DataContractSerializer和初始化
本文关键字:初始化 DataContractSerializer | 更新日期: 2023-09-27 18:26:08
在进一步思考了DataContractSerializer不调用构造函数或静态字段初始化器的含义后,让属性像这样自我初始化似乎是一种更干净的设计模式:
private ObservableCollection<object> myObjects;
public ObservableCollection<object> MyObjects
{
get
{
if (myObjects == null) myObjects = new ObservableCollection<object>();
return myObjects;
}
set
{
myObjects = value;
}
}
而不是像这样提供两个初始化路径:
public MyClass()
{
InitializeClass();
}
[OnDeserialized()]
private void OnDeserialized(StreamingContext c)
{
InitializeClass();
}
private void InitializeClass()
{
// Note here I can still use a field.
// Self-initialization requires a property.
myObjects = new ObservableCollection<objects>();
}
我主要担心的是,如果忘记了特殊的OnDeserialized
初始化,后一种模式不会使用new
构造类的单元测试失败,除非这些单元测试是专门设计的,知道它们可能在某个时候与DataContractSerializer
一起使用。
这感觉太纠结了。
自初始化方法的一个缺点是它需要属性而不是字段(因为字段初始化器被DataContractSerializer
忽略)。
还有其他我没有考虑的缺点吗?
这是一个延伸,但它可能对你有用,这取决于你有多少神奇的可计算数据,以及你使用它的程度。你可以使用IObjectReference来处理它。请参阅http://blogs.msdn.com/b/carlosfigueira/archive/2011/09/27/wcf-extensibility-other-serialization-extensions.aspx例如。