2012-11-06 34 views
0

DataContract解串器,如果我有一個xml這樣的:與字典

<Foo> 
<Bar> 
    <A>aaaa</A> 
    <B>bbb</B> 
</Bar> 
<C>ccc</C></Foo> 

我可以反序列化與字典結構和字符串屬性一樣使用相同的DataContract解串器之後的Foo類?以A和B爲關鍵詞,並將「aaaa」和「bbb」作爲詞典中的Values?

[DataContract] 
class Foo 
{ 

    [DataMember] 
    public Dictionary<string, string> Bar 
    { get; set; } 

    [DataMember] 
    public string C { get; set; } 
} 

我知道有在MSDN網站上使用CollectionDataContract一個例子,但它只是使用了A作爲重點和B值。

+0

詞典需要鑰匙,如果你只想要一個和B是價值觀,那麼你的鑰匙是什麼?如果你不想讓鍵使用List來代替。 – Diego

+0

不,我希望A和B是關鍵,內部是什麼值。我說的是有一個使用A作爲鍵和B作爲值的例子。 http://msdn.microsoft.com/en-us/library/aa347850(v=vs.85).aspx – NewDTinStackoverflow

回答

0

沒有辦法自動做到這一點。如果你想要一個字典,你應該使用LINQ to XML,並自己創建一個。

0

我想你就可以得到的最接近的就是使用此代碼來測試像這樣

<UserQuery.Foo xmlns="http://schemas.datacontract.org/2004/07/" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
    <Bar> 
     <Barentry> 
      <A>aaa</A> 
      <B>bbb</B> 
     </Barentry> 
    </Bar> 
<C i:nil="true"/> 
</UserQuery.Foo> 

void Main() 
{ 

var B=new Bar(); 
B.Add("aaa","bbb"); 
var tFoo=new Foo(){Bar=B}; 
DataContractSerializer ser=new DataContractSerializer(typeof(Foo)); 
ToXml<Foo>(tFoo).Dump(); 

} 


     public static string ToXml<T>(T obj) 
     { 
      DataContractSerializer dataContractSerializer = new DataContractSerializer(obj.GetType()); 
      String text; 
      using (MemoryStream memoryStream = new MemoryStream()) 
      { 
       dataContractSerializer.WriteObject(memoryStream, obj); 
       byte[] data = new byte[memoryStream.Length]; 
       Array.Copy(memoryStream.GetBuffer(), data, data.Length); 
       text = Encoding.UTF8.GetString(data); 
      } 
      return text; 
     } 



[System.Runtime.Serialization.DataContract] 
public class Foo 
{ 

    [System.Runtime.Serialization.DataMember] 
    public Bar Bar 
    { get; set; } 

    [System.Runtime.Serialization.DataMember] 
    public string C { get; set; } 
} 

[CollectionDataContract 
    (ItemName="Barentry", 
    KeyName = "A", 
    ValueName = "B")] 
public class Bar:Dictionary<string,string>{ 
}