Каков наилучший способ сериализации / десериализации словаря <String, String> в .Net 2.0? - PullRequest
2 голосов
/ 11 июля 2009

Мне нужно иметь возможность сериализовать / десериализовать словарь в удобочитаемую (и, если нужно, редактируемую) строку (желательно XML или Json).

Мне нужно работать только со строковыми словарями, а не с другими типами объектов. Однако предполагается, что строки представляют собой произвольный текст, поэтому они могут содержать символы, такие как одинарные / двойные кавычки и т. Д., Поэтому их необходимо правильно кодировать / экранировать.

Этот проект основан на .Net 2.0, поэтому, к сожалению, я не могу использовать JSON.Net.

Есть идеи, как лучше это сделать быстро?

Очевидно, я мог бы написать свой собственный код для этого, но я ожидаю, что если я пойду таким образом, я смогу избежать многих головных болей, особенно в части десериализации.

Любые идеи будут оценены.
Спасибо!
Daniel

Ответы [ 3 ]

2 голосов
/ 20 июня 2010

Насколько я знаю, сейчас есть три легко выполнимых решения этой ситуации:

1) JSON.Net, который работает в .Net 2.0 с отдельным двоичным файлом (делает ДЕЙСТВИТЕЛЬНО легким, а json - хороший формат, более компактный, чем xml).

2) Реализация Сериализуемого словаря, например: http://weblogs.asp.net/pwelter34/archive/2006/05/03/444961.aspx (Обратите внимание, что эта версия не обрабатывает двоичную сериализацию (BinaryFormatter) из-за отсутствующих конструкторов и отсутствующего атрибута «[Serializable]», но для исправления требуется 2 минуты - хотелось бы, чтобы автор обновил сообщение!)

3) SharpSerializer также упрощает работу, хотя вывод Xml по умолчанию довольно громоздкий (не пытался поиграть с настройками).

Извините, что опубликовал это так поздно, но я не уверен, почему вопрос томится как неотвеченный, и я думаю, что любой из этих ответов поможет случайному поисковику!

ОБНОВЛЕНИЕ: Очевидно, я пропустил один, NXmlSerializer , хотя я не играл с этим - я понятия не имею, как он сравнивается с другими.

1 голос
/ 11 июля 2009

Я думаю, что самый простой способ - это создать класс-обертку, который легко сериализуется в сериализаторе XML и будет доступен для Dictionary<string,string>. Это сделает его легко редактируемым и снимет все проблемы с рассмотрения.

Например

public class Wrapper { 
  public List<string> Keys {get; set; }
  public List<string> Values {get; set; }
  public Wrapper() {}
  public Wrapper(Dictionary<string,string> map) {
    Keys = new List<string>(map.Keys);
    Values = new List<string>(map.Values);
  }
  public Dictionary<string,string> GetMap() {
    Dictionary<string,string> map = new Dictionary<string,string>();
    for ( int i = 0; i < Keys.Length; i++ ) {
      map[Keys[i]] = Values[i];
    }  
    return map;
  }
}
0 голосов
/ 11 июля 2009

Реализация IXmlSerializable , это будет очень просто.

Псевдокод:

public class CoolHash : Dictionary<String, String>, IXmlSerializable
{
   void WriteXml(XmlWriter writer){
     foreach(string key in this.Keys){
        writer.WriteElementText(key, this[key]);
     }
   }
}
...