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忽略)。

还有其他我没有考虑的缺点吗?

DataContractSerializer和初始化

这是一个延伸,但它可能对你有用,这取决于你有多少神奇的可计算数据,以及你使用它的程度。你可以使用IObjectReference来处理它。请参阅http://blogs.msdn.com/b/carlosfigueira/archive/2011/09/27/wcf-extensibility-other-serialization-extensions.aspx例如。