Почему конструктор моего абстрактного базового класса не вызывается, когда объект инициализируется десериализатором WCF? - PullRequest
7 голосов
/ 26 августа 2009

Вопрос в заголовке ... Короче - у меня есть сервис WCF, который предоставляет операции, которые возвращают классы сущностей. Клиентские классы наследуются от абстрактного базового класса вместо стандартного System.Object. Для абстрактного базового класса определен конструктор по умолчанию. При вызове одного из сервисных методов я ожидал, что этот конструктор будет вызван, когда сериализатор datacontract материализует возвращаемые объекты. Однако конструктор не вызывается. С другой стороны, если я сам создаю экземпляр класса сущности, то вызывается конструктор абстрактного класса.

Почему, о, и есть ли обходной путь? Или я что-то упустил - есть ли другая сигнатура конструктора, которая вызывается сериализатором datacontract при материализации объектов? Если нет, то как сериализатор данных может материализовать объекты, не вызывая конструкторы так же, как вызов «newClass ()»? Или я выпил слишком много кофе сегодня (только 2 или 3 чашки)?

Ответы [ 2 ]

11 голосов
/ 26 августа 2009

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

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

1 голос
/ 21 сентября 2009

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

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

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

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

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

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