带有字典的Datacontract求职者



如果我有XML,则喜欢:

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

我可以将其验证为具有字典结构和字符串属性(如使用相同的数据合同求职者)之类的foo类吗?用a和b作为键," aaaa"one_answers" bbb"作为字典中的值?

[DataContract]
class Foo
{
  [DataMember]
  public Dictionary<string, string> Bar
  { get; set; }
  [DataMember]
  public string C { get; set; }
}

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

无法自动执行此操作。如果要使用字典,则应将linq用于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>

使用此代码测试:

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

最新更新