1
我有一个对象结构如下:DataContractSerializer的反序列化已知类型
[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,然后再反序列化它,它将起作用。差异似乎在'条件'条目中,这些条目以'<条件i:类型=“AttributeEqualTo”>'而不是''的形式指定。 –
mellamokb
是的,我也看到了。我正在尝试对合同进行调整以获得所需的XML。 – Matt
为什么当'T'实际上并没有被引用到课堂内的任何地方时,你使用泛型?您是否打算将'ExpectedValue'最终输入为'T'? – mellamokb