2013-01-17 119 views
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

+0

您是否手動構建該XML?如果您嘗試使用DataContractSerializer生成XML,然後再反序列化它,它將起作用。差異似乎在'條件'條目中,這些條目以'<條件i:類型=「AttributeEqualTo」>'而不是''的形式指定。 – mellamokb

+0

是的,我也看到了。我正在嘗試對合同進行調整以獲得所需的XML。 – Matt

+0

爲什麼當'T'實際上並沒有被引用到課堂內的任何地方時,你使用泛型?您是否打算將'ExpectedValue'最終輸入爲'T'? – mellamokb

回答

0

嘗試刪除仿製藥 - 這往往打破序列化。

相關問題