我看到一种普遍存在的belief https://blogs.msdn.microsoft.com/adam/2010/09/10/how-to-serialize-a-dictionary-or-hashtable-in-c/(2009年文章)整个互联网Hashtable https://msdn.microsoft.com/en-us/library/system.collections.hashtable(v=vs.110).aspx类不可序列化;但是,我找不到任何支持这一概念的现代文档。
这种信念源于另一个没有记录的信念,即IDictionary https://msdn.microsoft.com/en-us/library/s4ys34ea(v=vs.110).aspx接口阻止序列化;然而,今天我在 MSDN 中找不到任何支持这一说法的内容。
更远,Hashtable
实施ISerializable
并包含接受序列化信息的扩展方法。
那么,到底是怎么回事呢?是Hashtable
可序列化?支持这个概念的文档在哪里IDictionary
?
进一步澄清 (请阅读):
该声明称IDictionary
不可序列化,有大量文档支持;然而,本文重点关注与类的基于 XML 的序列化交互的使用。ISerializable
正如下面的评论和 MSDN 中提到的,表明类是可序列化的。这也意味着该类必须负责其自己的序列化。
我认为这否定了哈希表不可序列化的说法。这也许就是我问题的起源。
这种普遍的信念之所以如此普遍,是因为它是真的:
var t = new Hashtable();
t.Add("Hi!", "I'm here");
t.Add("Hm", "Yup");
var serializer = new XmlSerializer(typeof(Hashtable));
using (var sw = new StringWriter())
{
serializer.Serialize(sw, t);
Console.WriteLine(sw.ToString());
}
throws
NotSupportedException:不支持类型 System.Collections.Hashtable,因为它实现 IDictionary。
这并不意味着它是序列化哈希表实际上是不可能的。当然,我可以迭代所有键和值,将它们写入字符串,然后从中重建哈希表。只是我无法完全使用序列化基础设施。
这里的道理是什么?实际上非常简单 - XmlSerializer 旨在生成良好的 XML,本着 XML 设计的交换格式的精神。 XML 没有任何类型的字典或“键值”机制。因此,为了支持哈希表序列化,他们必须使用自己的规则创建自己的“子格式”。在设计 .NET 时,这是一个巨大的禁忌 - XML 是交换格式。任何格式的扩展(哈哈)都意味着你不再兼容,无论你有多么好的想法。
当然,现在每个人和他们的祖母都在生成不用于交换目的的 XML 数据。这也不完全是一件坏事(毕竟,.NETconfig
文件也是 XML 格式)。但这也是错误的。
相反,采取类似的东西BinaryFormatter
。这是 .NET 团队设计整个格式的类,并且不受标准限制。你瞧——BinaryFormatter
可以序列化和反序列化Hashtable
正好。
因此,稍微更正确的想法是“Hashtable 无法序列化为有效的标准 XML。当您尝试序列化 Hashtable 时,XmlSerializer 类尤其会抛出错误。”
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)