Почему конструктора моего абстрактного базового класса не вызывают, когда объект инициализируется WCF deserializer?

System.Collections.CaseInsensitiveComparer

или

System.StringComparer.OrdinalIgnoreCase
7
задан Marc Gravell 26 August 2009 в 10:35
поделиться

2 ответа

WCF (и DataContractSerializer в частности) не использует конструкторы. Нет, правда (он использует FormatterServices.GetUninitializedObject для создания необработанных объектов).

Ожидается, что все данные будут инициализированы либо сериализатором, либо для несериализованных полей - обратными вызовами сериализации, которые вы добавить (например, через [OnDeserialized] ).

11
ответ дан 6 December 2019 в 21:17
поделиться

Я полностью понимаю причины, но не понимаю, почему они не поддерживают обратные вызовы сериализации в Silverlight. Мне кажется, что в связи WCF - Silverlight я не могу инициализировать свой контракт данных, не взломав себя. Итак, если у меня был частный член в моем базовом классе для внутреннего использования (например, поведение отмены-повтора), я не могу использовать конструктор по умолчанию:

Stack<PropertyChange> UndoStack = new Stack<PropertyChange>();

Это просто не работает. Чтобы заставить его работать, я должен написать что-то вроде этого:

Stack<PropertyChange> _UndoStack;
Stack<PropertyChange> UndoStack
{
     get
     {
           return _UndoStack == null ? (_UndoStack = new Stack<PropertyChange>()) : _UndoStack;
     }
}

Мне кажется, это обходной путь. У кого-нибудь есть идеи получше?

1
ответ дан 6 December 2019 в 21:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: