2012-05-08 2 views
0

Я использую следующий код для сериализации/десериализации от объекта XMLКак форматировать сериализацию IDictionary с помощью DataContractSerializer?

using System.Runtime.Serialization; 
public static string Serialize<T>(this T obj) 
     { 
      var serializer = new DataContractSerializer(obj.GetType()); 
      using (var writer = new StringWriter()) 
      using (var stm = new XmlTextWriter(writer)) 
      { 
       serializer.WriteObject(stm, obj); 
       return writer.ToString(); 
      } 
     } 

     public static T Deserialize<T>(this string serialized) 
     { 
      var serializer = new DataContractSerializer(typeof(T)); 
      using (var reader = new StringReader(serialized)) 
      using (var stm = new XmlTextReader(reader)) 
      { 
       return (T)serializer.ReadObject(stm); 
      } 
     } 

Чтобы сделать этот код работать с IDictionary, я следующий пользовательский словарь класса:

[CollectionDataContract(Name = "Kenan", ItemName="Items", KeyName="Row", Namespace="spell", ValueName="Values")] 
public class CustomRowList : Dictionary<RowXML, List<ColumnXML>> 
{ 

} 

Проблема в том, когда код выводит мой

Dictionary<RowXML, List<ColumnXML>> 

это выглядит следующим образом:

enter image description here

не нужны <Items><Values> и узлы. Вместо этого, я хотел бы его вывести его как:

<RowList> 
<Row> 
<Title></Title> 
<Help_Text></Help_Text> 
<ClassName></ClassName> 
<ColumnList> 
<Column> 
<ClassName></ClassName> 
<Help_Text></Help_Text> 
<Title></Title> 
</Column> 
<Column> 
... 

Как я могу сделать формат DataContractSerializer мой словарь таким образом? Я попытался установить

ItemName 

И

ValueName 

на

[CollectionDataContract] 

Свойства в пустой, но это не работало.

ответ

2

Похоже, вы хотите настроить выход xml вашего класса коллекции. Единственный способ добиться этого ожидаемого результата - реализовать интерфейс IXmlSerializable, как показано ниже.

[CollectionDataContract(Name = "Kenan", ItemName="Items", KeyName="Row", Namespace="spell", ValueName="Values")] 
public class CustomRowList : Dictionary<RowXML, List<ColumnXML>>, IXmlSerializable 
{ 

} 

Пожалуйста, смотрите здесь для получения дополнительной информации

Proper way to implement IXmlSerializable?

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