C# 带字典的DataContract反序列化器

C# 带字典的DataContract反序列化器,c#,.net,datacontractserializer,C#,.net,Datacontractserializer,如果我有一个xml,比如: <Foo> <Bar> <A>aaaa</A> <B>bbb</B> </Bar> <C>ccc</C></Foo> aaaa bbb ccc 我可以使用相同的DataContract反序列化器将其反序列化为具有字典结构和字符串属性的Foo类吗?在字典中,A和B是键,“aaaa”和“bbb”是值 [DataContract] c

如果我有一个xml,比如:

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

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

[DataContract]
class Foo
{

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

  [DataMember]
  public string C { get; set; }
}
[DataContract]
福班
{
[数据成员]
公共字典栏
{get;set;}
[数据成员]
公共字符串C{get;set;}
}

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

无法自动执行此操作。如果你想要一本字典,你应该使用LINQ to XML,然后自己创建一本。

我认为你能找到的最接近的东西就是这样的东西

<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>

aaa
bbb
使用此代码测试:

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>{
}
void Main()
{
var B=新条();
B.添加(“aaa”、“bbb”);
var tFoo=newfoo(){Bar=B};
DataContractSerializer ser=新的DataContractSerializer(typeof(Foo));
ToXml(tFoo.Dump();
}
公共静态字符串ToXml(T obj)
{
DataContractSerializer DataContractSerializer=新的DataContractSerializer(obj.GetType());
字符串文本;
使用(MemoryStream MemoryStream=new MemoryStream())
{
dataContractSerializer.WriteObject(memoryStream,obj);
字节[]数据=新字节[memoryStream.Length];
Copy(memoryStream.GetBuffer(),data,data.Length);
text=Encoding.UTF8.GetString(数据);
}
返回文本;
}
[System.Runtime.Serialization.DataContract]
公开课Foo
{
[System.Runtime.Serialization.DataMember]
公共酒吧
{get;set;}
[System.Runtime.Serialization.DataMember]
公共字符串C{get;set;}
}
[CollectionDataContract
(ItemName=“Barentry”,
KeyName=“A”,
ValueName=“B”)]
公共类:字典{
}

字典需要键,如果您只希望A和B是值,那么键将是什么?如果您不想使用键,请使用列表。不,我希望A和B是键,而其中的值是什么。我是说有一个使用A作为键,B作为值的例子。