【发布时间】:2013-01-17 19:24:00
【问题描述】:
我有一个对象结构如下:
[DataContract]
public abstract class Condition<T>
{
[DataMember] public string Id { get; set; }
}
[DataContract(Name = "AttributeEqualTo", Namespace = "")]
public class AttributeEqualTo<T> : Condition<T>
{
[DataMember] public string AttributeName { get; set; }
[DataMember] public string ExpectedValue { get; set; }
}
[DataContract(Name = "AttributeNotEqualTo", Namespace = "")]
public class AttributeNotEqualTo<T> : AttributeEqualTo<T>
{
}
[CollectionDataContract(Name = "Conditions", Namespace = "")]
[KnownType("KnownTypes")]
public class ConditionSet<T> : Collection<Condition<T>>
{
public static IEnumerable<Type> KnownTypes()
{
var knownTypes = new Collection<Type>
{
typeof(AttributeEqualTo<T>),
typeof(AttributeNotEqualTo<T>),
};
return knownTypes;
}
}
给定以下 XML:
<Conditions>
<AttributeEqualTo>
<Id>C1</Id>
<AttributeName>Foo</AttributeName>
<ExpectedValue>Bar</ExpectedValue>
</AttributeEqualTo>
<AttributeNotEqualTo>
<Id>C2</Id>
<AttributeName>Blah</AttributeName>
<ExpectedValue>Value</ExpectedValue>
</AttributeNotEqualTo>
</Conditions>
当我反序列化它时,我希望得到一个条件集合,其中包括 XML 中定义的两个条件中的每一个。我遇到的问题是我得到了集合,但它是空的。
我已经测试了单独反序列化条件的能力,它似乎工作正常。
我使用以下内容作为如何定义合同的参考,Data Contract Known Types
【问题讨论】:
-
您是否手动构建了该 XML?如果您尝试使用 DataContractSerializer 生成 XML,然后再次反序列化它,它就可以工作。区别似乎在于
Condition条目,它们以<Condition i:type="AttributeEqualTo">的形式指定,而不是<AttributeEqualTo>。 -
是的,我也看到了。我正在尝试对合同进行调整以获得所需的 XML。
-
当
T在类中的任何地方实际上都没有被引用时,你为什么要使用泛型?您是否打算将ExpectedValue最终输入T? -
还有另一种未包含的方法,它将 T 的实例作为参数。
-
我建议将代码转换为使用
XmlSerializer,这样您可以更好地控制命名空间。此外,摆脱 XML 类中的泛型也会有很大帮助。您可能需要使用某种适配器模式在序列化层和域类之间来回转换对象。
标签: c# deserialization datacontractserializer