2010-05-20 102 views
0

我已經通過msdn:datacontracts給出了一個公平的閱讀,我找不到爲什麼以下不起作用。 那麼這裏有什麼問題?爲什麼ExtendedCanadianAddress不被DataContract序列化程序識別?C#繼承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

我會努力的攝製,但馬上蝙蝠的屬性看錯了......

[DataContact] VS [DataContract]注意失蹤 「R」

而且,儘管您的c#命名空間不同,但您的DataContract命名空間相同,並且您有多個同名的合同

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

+0

我所擁有的是命名空間ABC中的最終合同,並且在XYZ中重新包裝合同以用備用構造函數包裝ABC合同。 我想通過使用繼承來實現更少的代碼。 – user346375 2010-05-20 19:43:03

+0

繼承很好,但每個已知的實現必須具有唯一的'Name'或駐留在唯一的'Namespace'中。否則,無法將請求與正確的具體實現相匹配。 – JoeGeeky 2010-05-20 21:13:48