我已经通过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