我需要能够将Dictionary序列化/反序列化为人类可读的(如果它归结为人类可编辑的)字符串(最好是XML或Json)。
我只需要使用String字典,而不是其他任何类型的对象类型。 但是,字符串被假定为自由文本,因此它们可以包含单引号或双引号等字符,因此必须对它们进行正确编码/转义。
这个项目基于.Net 2.0,所以不幸的是我不能使用JSON.Net。
任何想法最快的方法是什么?
我显然可以编写自己的代码来执行此操作,但是如果我这样做的话,我希望能找到很多令人头疼的问题,特别是在反序列化部分。
任何想法都将受到赞赏
谢谢!
丹尼尔
答案 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]);
}
}
}