Использую 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
В общем, ковыряюсь уже долго и никак не соображу, можно ли обмануть сериализатор и подсунуть ему объект с унаследованным типом без каких-то дополнительных верчений с пересозданием объектов. Если в хабрасообществе кто-то с таким сталкивался, подскажите, пожалуйста, или, если это вообще неправильный подход, то подскажите, плз, как правильнее.