Как сериализовать производный тип как его базовый тип с WCF - PullRequest
12 голосов
/ 10 ноября 2010

У меня есть общая библиотека с некоторыми объектами. Затем у меня есть сервисный проект, который ссылается на общую библиотеку и создает некоторые производные типы из объектов в общей библиотеке.

Я хочу, чтобы мой сервис сериализовал производные типы как их базовые типы, определенные в общей библиотеке.

Я не могу использовать KnownTypes для объектов в общей библиотеке, потому что я не хочу, чтобы общая библиотека ссылалась на сборки служб.

Так как я могу сделать так, чтобы wcf сериализовал производные типы как их базовые типы?

Хотел бы я сделать что-то вроде ...

[DataContract (SerializeAsType = typeof (BaseType))] открытый класс DerivedType: BaseType { }

Возможно ли что-нибудь подобное?

Ответы [ 2 ]

7 голосов
/ 12 ноября 2010

Мы только что «решили» эту проблему, установив унаследованный класс [DataContract (Name = "BaseClass")]. Он работает, даже если унаследованный класс является внутренним и определен в другом проекте.

Надеюсь, это поможет.

3 голосов
/ 10 ноября 2010

Вы используете .NET 4.0? Для этого вы можете использовать DataContractResolver, если вы:

http://msdn.microsoft.com/en-us/library/system.runtime.serialization.datacontractresolver.aspx

Это также в основном то, что Entity Framework 4.0 делает для своего DataContractResolver для типов прокси.

Вот пример: http://blogs.msdn.com/b/youssefm/archive/2009/06/05/introducing-a-new-datacontractserializer-feature-the-datacontractresolver.aspx

(см. DeserializeAsBaseResolver в ссылке).

EDIT: Если вы не используете .NET 4.0, я думаю, что ваш следующий лучший вариант - DataContractSurrogate: http://msdn.microsoft.com/en-us/library/system.runtime.serialization.idatacontractsurrogate.aspx. ... так что вы можете контролировать сериализацию вручную, но это может запутаться.

Оба передаются в конструктор вашего DataContractSerializer и могут быть настроены для WCF через DataContractSerializerOperationBehavior: http://msdn.microsoft.com/en-us/library/system.servicemodel.description.datacontractserializeroperationbehavior.aspx.

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