У меня есть простой контракт данных:
[DataContract]
public class MyData
{
[DataMember]
public string AwesomeData { get; set; }
}
И контракт на обслуживание:
[ServiceContract]
public interface IMyDataService
{
[OperationContract]
MyData GetAwesomeData();
}
В сборке на стороне сервера я создаю производный класс для выполнения обработки:
public class MyDataWithInnerds: MyData
{
public MyDataWithInnerds(object intializationStuff)
{
AwesomeData = Hypermaxulate(initializationStuff);
}
}
и реализация сервиса:
public class MyDataService: IMyDataService
{
public MyData GetAwesomeData()
{
return new MyDataWithInnerds(HupnerRayvakManager.GetInitializationStuff());
}
}
MyDataWithInnerds - это просто функциональная реализация контракта MyData, основанного исключительно на данных.
Есть ли в любом случае без украшения MyData и ссылки MyDataWithInnerds, чтобы сказать сериализатору сериализовать MyDataWithInnerds как MyData?Сборка с MyData также предоставляется клиентам.Я не хочу, чтобы на стороне сервера ссылались только на MyDataWithInnerds.
Мне не нужно десериализовать его в MyDataWithInnerds.Я предполагаю, что мне нужно будет клонировать экземпляр MyDataWithInnerds в экземпляр MyData, чтобы он не имел никакой информации о типе, связанной с MyDataWithInnerds, но было бы очень эффективно не делать этого и просто сообщить сериализатору«Я знаю, что это MyDataWithInnerds, но вы можете просто обращаться с ним как с базовыми MyData»
Спасибо, Майк
РЕДАКТИРОВАТЬ
Я смогдобавить следующее в мой конфигурационный файл на сервере:
<system.runtime.serialization>
<dataContractSerializer>
<declaredTypes>
<add type="MyClientLib.MyData, MyClientLib">
<knownType type="MyServerLib.MyDataWithInnerds, MyServerLib"/>
</add>
</declaredTypes>
</dataContractSerializer>
</system.runtime.serialization>
И это заставит сериализацию работать правильно.
Это просто оставляет два побочных вопроса:
- В моей сериализации JSON я получаю член "__type", который содержит тип производного класса.Могу ли я удалить это?
- Есть ли декларативный способ сделать на объектах сервера (не MyData), что я сделал в конфигурации (добавив KnownType's)?
Спасибо2,Mike