DataContract и наследование? - PullRequest
       28

DataContract и наследование?

29 голосов
/ 19 декабря 2011

Как использовать DataContract с наследованием?Будет ли работать код ниже?

[DataContract]
public class ConsoleData
{
    [DataMember]
    public String Description { get; set; }

}

[DataContract]
public class SomeData : ConsoleData
{

    [DataMember]
    public int Volume { get; set; }
    ......

Ответы [ 2 ]

43 голосов
/ 19 декабря 2011

Да, это будет работать.

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; }
    ......
.
2 голосов
/ 19 декабря 2011

Вам потребуется использовать атрибут KnownType, если вы используете XmlSerializerFormat для своего ServiceContract:

[DataContract]
public class ConsoleData
{
    [DataMember]
    public String Description { get; set; }
}

[DataContract, KnownType(typeof(ConsoleData))]
public class SomeData : ConsoleData
{
    [DataMember]
    public int Volume { get; set; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...