Возможна ли прозрачная сериализация наследуемых типов в WCF?

Использую WebServiceHost для реализации RESTful-сервиса. Есть контракт ProxyClass, о котором знают сервер и клиент, он выглядит, положим, так:
[DataContract]
class ProxyClass
{
 [DataMember]
 public virtual string Property1 { get; set; }

 [DataMember]
 public virtual int Property2 { get; set; }
}


На сервере есть тип ProxyClassServer, который выглядит, например, так:
class ProxyClassServer: ProxyClass
{
 public override Property1 {
  get { return "Test!"; }
  set { }
 }
}


Клиент не знает о том, что на сервере есть собственная реализация ProxyClass. Клиент получает с сервера json или xml-данные и десериализует их в ProxyClass, присваивая всем нужным полям соответствующие значения, и работает именно с этой структурой.

Если сервер вернул объект класса ProxyClassServer, то клиент должен получить xml-структуру, в которой указано, что десериализовывать следует в ProxyClass. Проблема в сериализации на стороне сервера.


В WCF можно использовать IDataContractSurrogate. При реализации интерфейса получаем метод GetDataContractType и GetObjectToSerialize (среди всех прочих). В принципе, в GetObjectToSerialize мы получаем ссылку на объект класса ProxyClassServer и targetType=ProxyClass, но здесь проблема в том, что объект надо пересоздавать, чтобы отправить сериализатору обект именно базового класса. Сериализатор не понимает, если получает объект типа ProxyClassServer — либо ругается, что тип не помечен как DataContract, либо отправляет клиенту указание, что сериализованный тип — ProxyClassServer

В общем, ковыряюсь уже долго и никак не соображу, можно ли обмануть сериализатор и подсунуть ему объект с унаследованным типом без каких-то дополнительных верчений с пересозданием объектов. Если в хабрасообществе кто-то с таким сталкивался, подскажите, пожалуйста, или, если это вообще неправильный подход, то подскажите, плз, как правильнее.
  • Вопрос задан
  • 3083 просмотра
Пригласить эксперта
Ответы на вопрос 1
Sellec
@Sellec Автор вопроса
Кодер
Такая же ситуация описана тут, но автор решил проблему «в лоб» — пересозданием объекта.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы