Да, это будет работать.
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; }
......
.