什么是在.Net 2.0中序列化/反序列化Dictionary <string,string>的最佳方法?</string,string>

时间:2009-07-10 20:14:31

标签: serialization dictionary .net-2.0

我需要能够将Dictionary序列化/反序列化为人类可读的(如果它归结为人类可编辑的)字符串(最好是XML或Json)。

我只需要使用String字典,而不是其他任何类型的对象类型。 但是,字符串被假定为自由文本,因此它们可以包含单引号或双引号等字符,因此必须对它们进行正确编码/转义。

这个项目基于.Net 2.0,所以不幸的是我不能使用JSON.Net。

任何想法最快的方法是什么?

我显然可以编写自己的代码来执行此操作,但是如果我这样做的话,我希望能找到很多令人头疼的问题,特别是在反序列化部分。

任何想法都将受到赞赏 谢谢!
丹尼尔

3 个答案:

答案 0 :(得分:2)

据我所知,现在有三种简单可行的解决方案:

1)JSON.Net,它在.Net 2.0中使用单独的二进制文件工作(使事情变得非常简单,json是一种很好的格式,比xml更紧凑)。

2)Serializable Dictionary实现,例如: http://weblogs.asp.net/pwelter34/archive/2006/05/03/444961.aspx (请注意,由于缺少构造函数并缺少“[Serializable]”属性,此版本不处理二进制序列化(BinaryFormatter),但这需要2分钟才能修复 - 我希望作者更新帖子!)

3)SharpSerializer,虽然默认情况下Xml输出非常笨重(但没有尝试过使用设置),但也很简单。

很抱歉这么晚发帖,但我不确定为什么这个问题没有得到解决,我认为这些答案中的任何一个都会对临时搜索者有所帮助!

更新:显然我错过了一个,NXmlSerializer,虽然我没有玩过这个 - 我不知道它与其他人的比较。

答案 1 :(得分:1)

我认为最简单的方法是创建一个包装类,它可以在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;
  }
}

答案 2 :(得分:0)

实施IXmlSerializable,这将非常简单。

伪代码:

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