Как сериализовать производный тип в качестве базового типа с 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" )]. Он работает, даже если унаследованный класс является внутренним и определяется в другом проекте.
Надеюсь, что это поможет.