我知道字典不会按照添加它们的顺序存储它们的键值对,但是如果我将相同的键值对(可能以不同的顺序)添加到两个不同的字典并序列化结果,那么文件上的数据是一样的吗?
编辑:为了澄清,我要具体询问GetObjectData()的输出,而不是任何特定的序列化器。请考虑以下代码:
Dictionary<string,List<string>> dict1 = new Dictionary<string,List<string>>();
Dictionary<string,List<string>> dict2 = new Dictionary<string,List<string>>();
string key11 = "key1";
string key12 = "key1";
string key21 = "key2";
string key22 = "key2";
List<string> values11 = new List(1);
List<string> values12 = new List(1);
List<string> values21 = new List(1);
List<string> values22 = new List(1);
values11.add("value1");
values12.add("value1");
values21.add("value2");
values22.add("value2");
dict1.add(key11, values11);
dict2.add(key22, values22);
dict1.add(key21, values21);
dict2.add(key12, values12);
对于GetObjectData(),dict1和dict2会返回相同的东西吗?如果没有,为什么不呢?
答案 0 :(得分:4)
是否最终会成为未来版本和/或替代实施中可能无法保证的实施细节;因此,我建议至少有一个编写的测试可以验证它并且可以作为标准测试的一部分运行。但是如果你要实现一个绝对依赖它的解决方案,那么编写自己的序列化器可能是值得的......
答案 1 :(得分:2)
几乎肯定不会! Dictionary
通过散列工作,并且必须有一些散列冲突解决方法。因此,假设您第一次浏览字典时按顺序添加key1
和key2
。对于散列到该特定值的键,key1
最终位于“正常”位置。 key2
存储在“其他地方”(取决于实现)。
现在更改添加密钥的顺序。 key2
进入正常位置,key1
进入“其他地方。”
您无法对字典中项目的顺序做出任何假设。
即使您可以保证订单,也可以通过下一次更改.NET Framework使该保证无效,因为string.GetHashCode
的实现可能会发生变化(过去已经发生)。这将完全改变键存储在字典的底层数据结构中的顺序,因此由先前版本的Framework创建的任何已保存数据可能与您使用新版本运行时创建的数据不一致。
答案 2 :(得分:1)
这将取决于特定(版本)字典的内部实现细节。
总的来说,不是。
这里有关于使用序列化来确定平等的主题,它在几个极端情况下都失败了。