2010-05-20 104 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