2012-11-06 1 views
0

Если у меня есть XML, как:DataContract десериализатор с Словарем

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

Может ли я десериализацию его в класс Foo со структурой словаря и струнными собственностями, как следующее, используя тот же DataContract десериализатор? С A и B в качестве ключей и «aaaa» и «bbb» в качестве значений в словаре?

[DataContract] 
class Foo 
{ 

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

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

Я знаю, что есть пример использования CollectionDataContract на сайте MSDN, но он использует только А как ключ и 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>{ 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^