0

私が次のようなxmlを持っている場合:

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

同じDataContractDeserializerを使用して、次のように辞書構造と文字列プロパティを持つ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 に答える