C # Наследование DataContract производных типов - PullRequest
0 голосов
/ 20 мая 2010

Я внимательно прочитал msdn: datacontracts и не могу понять, почему не работает следующее. Так что же здесь не так? Почему ExtendedCanadianAddress не распознается сериализатором datacontract?

Введите 'XYZ.ExtendedCanadianAddress' с именем контракта данных 'CanadianAddress: http://tempuri.org/Common/Types' не ожидается. Добавьте любые типы, которые не известны статически, в список известных типов, например, с помощью атрибута KnownTypeAttribute или добавив их в список известных типов, передаваемых DataContractSerializer.

Дано:

namespace ABC  
{  
 [KnownType(typeof(Address))] 
 public abstract class Z  
 {
   //stuff
   //method that adds all types() in namespace to self
 }

 [KnownType(typeof(CanadianAddress))]  
 [DataContract(Name = "Address", Namespace = "http://tempuri.org/Types")]  
 public class Address : Z
 {}

 [DataContract(Name = "CanadianAddress", Namespace = "http://tempuri.org/Types")]
 public class CanadianAddress : Address
 {}
}

namespace XYZ
{
 [KnownType(typeof(ExtendedCanadianAddress))
 [DataContract(Name = "Address", Namespace = "http://tempuri.org/Types")] 
 public class ExtendedAddress : Address
 {
   //this serializes just fine
 }
 [DataContract(Name = "CanadianAddress", Namespace = "http://tempuri.org/Types")] 
 public class ExtendedCanadianAddress : CanadianAddress
 {
   //will NOT serialize
 }
}

1 Ответ

1 голос
/ 20 мая 2010

Я попробую репро, но сразу же атрибуты выглядят неправильно ...

[DataContact] против [DataContract] Обратите внимание на пропущенное "r"

Кроме того, хотя ваши пространства имен c # отличаются, ваши пространства имен DataContract одинаковы, и у вас более одного контракта с одинаковым именем

Name = "CanadianAddress", Namespace = "http://tempuri.org/Types"

...