0

如果我有一个像这样的 xml:

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

我可以使用相同的 DataContract Deserializer 将其反序列化为具有字典结构和字符串属性的 Foo 类吗?以 A 和 B 作为键,将“aaaa”和“bbb”作为字典中的值?

[DataContract]
class Foo
{

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

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

我知道在 MSDN 网站上有一个使用 CollectionDataContract 的示例,但它只使用 A 作为键,B 作为值。

4

2 回答 2

0

没有办法自动执行此操作。如果你想要一本字典,你应该使用 LINQ to XML,并自己创建一个。

于 2012-11-06T03:36:08.633 回答
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>{
}
于 2012-11-06T03:43:53.327 回答