Ответ 1
Да, это сработает.
В DataContractAttribute
установлено значение Inherited
равным false, поэтому необходимо применить этот атрибут как к дочернему классу, так и к родительскому классу (как это было сделано в вопросе).
Вам нужно будет использовать атрибут
KnownType
, если вы хотите использовать ваши контракты данных с полиморфизмом.
Например
[ServiceContract]
interface MyWcfContract
{
[OperationContract]
HandleData(ConsoleData contractData);
}
Если вы вызываете метод следующим образом:
SomeData someData = new SomeData { Description = "Test", Volume = 30 };
// The method is expecting a ConsoleData instance,
// I'm passing a SomeData instance instead
myWcfProxy.HandleData(someData);
Тогда десериализатор на конце обслуживания не будет знать, что это экземпляр SomeData
, просто экземпляр ConsoleData
, который он ожидал.
Способ исправить это - зарегистрировать класс SomeData
как известный тип ConsoleData
.
[DataContract]
[KnownType(typeof(SomeData))]
public class ConsoleData
{
[DataMember]
public String Description { get; set; }
}
[DataContract]
public class SomeData : ConsoleData
{
[DataMember]
public int Volume { get; set; }
......