我已經通過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
}
}
我所擁有的是命名空間ABC中的最終合同,並且在XYZ中重新包裝合同以用備用構造函數包裝ABC合同。 我想通過使用繼承來實現更少的代碼。 – user346375 2010-05-20 19:43:03
繼承很好,但每個已知的實現必須具有唯一的'Name'或駐留在唯一的'Namespace'中。否則,無法將請求與正確的具體實現相匹配。 – JoeGeeky 2010-05-20 21:13:48