Как сериализовать производный тип в качестве базового типа с WCF

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

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

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

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

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

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

Возможно ли подобное?

Ответы

Ответ 1

Используете ли вы .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.

Ответ 2

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

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