C # Наследование производных типов контракта данных

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

Введите '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
 }
}

person user346375    schedule 20.05.2010    source источник


Ответы (1)


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

[DataContact] vs [DataContract] Обратите внимание на отсутствующую букву "r"

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

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

person JoeGeeky    schedule 20.05.2010
comment
У меня есть окончательный контракт в пространстве имен ABC и переработанный контракт в XYZ, чтобы заключить контракт ABC с альтернативными конструкторами. Я пытаюсь добиться меньшего количества кода, используя наследование. - person user346375; 20.05.2010
comment
Наследование - это нормально, но каждая известная реализация должна иметь уникальный Name или находиться в уникальном Namespace. В противном случае невозможно сопоставить запрос с правильной конкретной реализацией. - person JoeGeeky; 21.05.2010