DataContractSerializer и инициализация - PullRequest
1 голос
/ 29 февраля 2012

После дальнейшего размышления о последствиях 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>();
}   

Моя основная проблема заключается в том, что последний шаблон не будет проваливать модульные тесты, которые создают класс с new, если специальная инициализация OnDeserialized будет забыта, если толькоэти модульные тесты специально разработаны для того, чтобы знать, что они могут использоваться с DataContractSerializer в какой-то момент.

Это кажется слишком запутанным.

Недостатком подхода самоинициализации является то, что он требует свойств, а не полей (поскольку инициализаторы полей игнорируются DataContractSerializer).

Есть ли другие недостатки, которые я не рассматриваю?

1 Ответ

0 голосов
/ 26 апреля 2012

Это растянуто, но это может сработать для вас, в зависимости от того, сколько у вас этих волшебных вычислимых данных, и в какой степени вы их используете.Вы можете использовать IObjectReference, чтобы справиться с этим.См. http://blogs.msdn.com/b/carlosfigueira/archive/2011/09/27/wcf-extensibility-other-serialization-extensions.aspx для примера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...