哈希表可以序列化吗?

2024-01-22

我看到一种普遍存在的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(使用前将#替换为@)

哈希表可以序列化吗? 的相关文章

随机推荐

  • 在 jQuery Mobile 中的 Ajax 调用上显示页面加载微调器

    我正在使用 ajax 填充我的移动网络应用程序中的列表 我想做的是让 jQuery 移动加载微调器在执行此调用时出现 并在列表填充后消失 当前版本的 JQM 使用 mobile showPageLoadingMsg and mobile h
  • 如何使操作栏图标在单击时发生变化

    我在 Sherlock ActionBar 中有一组紫色背景的白色图标 我想让它们在被点击时变成深紫色 我有相同的深紫色图标 所以我想让这些可绘制对象显示在按下状态 现在 我知道如何在整个应用程序主题中执行此操作 但这意味着我必须对所有图标
  • 阻止本地网站在 Chrome 上强制使用 HTTPS?

    Chrome 已更新为在某些保留的域名上强制使用 HTTPS 不幸的是我的本地计算机之一出现在列表中 我的机器名称是 dev Chrome 现在自动重定向 http dev http dev 到 https dev https dev 我在
  • Java获取本地IP [重复]

    这个问题在这里已经有答案了 我正在尝试获取本地IP 它应该与 System out println Inet4Address getLocalHost getHostAddress or InetAddress addr InetAddre
  • jquery map函数对表的使用

    我有这张表 table thead tr th UtstyrsID th th Navn th th Utlevert th th Kommentar th tr thead tbody tr td 1 td tr tbody table
  • Java - 帮助在任意锚点绘制文本的最佳库[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我熟悉如何使用各种 FontMetrics 函数使文本垂直 水平居中等 但是 我正在寻找一个支持在相对
  • 使用组合键中的一列作为外键

    我试图看看是否可以使用复合键中的一列作为外键 我得到了奇怪的结果 CREATE TABLE TESTPARENT PK1 INT PK2 INT PRIMARY KEY PK1 PK2 Query OK 0 rows affected 0
  • C# 属性名称缩写

    C 属性的名称中怎么可能有 Attribute 例如DataMemberAttribute 但初始化时没有这个后缀 例如 DataMember private int i 根据C 语言规范 http msdn microsoft com e
  • 使用 Akka 进行依赖注入

    我在我的应用程序中经常使用 Guice 最近我开始学习 akka actor 并想用它重构我的应用程序 然而 一开始我就想知道我的所有技巧将如何与演员合作 我继续在谷歌上搜索 结果有点混乱 我找到的关于该主题的最新文档是 http leti
  • python 中的文本语言检测

    我正在尝试检测可能由未知数量的语言组成的文本的语言 下面的代码给了我不同的语言作为答案注意 我减少了评论 因为它在发布 不允许时给出错误 print detect print detect 的马来西亚 print detect Vi hav
  • 屏幕旋转后不会调用 onSaveInstanceState

    我知道有很多关于 onSaveInstanceState 的问题 但我无法找到问题的答案 我有一个扩展 AppCompatActivity 的活动 此活动使用 3 个片段 它有一个变量 int currentStep 来跟踪正在显示的片段
  • 从网页中打开查找器/资源管理器中的文件夹?

    如果我有文件系统路径 我可以在资源管理器 在 Windows 上 或 Finder 在 OS X 上 中打开一个窗口 显示该路径指向的文件夹吗 跨平台和 或无插件答案的 Cookie 点 For 节点 webkit http docs nw
  • PySpark 流式处理:窗口和转换

    我正在尝试从 Spark 流数据源读取数据 按事件时间对其进行窗口化 然后对窗口化数据运行自定义 Python 函数 它使用非标准 Python 库 我的数据框看起来像这样 Time Value 2018 01 01 12 23 50 20
  • 使用名称中带有字符串和迭代索引的 savefig

    我需要使用Python中的 savefig 来保存while循环的每次迭代的绘图 并且我希望我给图形指定的名称包含文字部分和数字部分 该数字来自数组或者是与迭代索引相关联的数字 我举一个简单的例子 index py from numpy i
  • 根据片段更改操作栏菜单状态

    我试图根据可见的片段在操作栏中显示 隐藏项目 在我的 MainActivity 中我有以下内容 Called whenever invalidateOptionsMenu is called Override public boolean
  • 如果我有嵌套的dispatch_async调用会发生什么?

    这可能是一个愚蠢的问题 但我需要自己问并解决这个问题 要将块提交到队列上执行 请使用以下函数dispatch sync and dispatch async 它们都采用队列和块作为参数 dispatch async立即返回 异步运行该块 而
  • 如果 CDI 和 EJB 都捆绑在 EAR 中,如何让 CDI 参与战争并运行 EJB

    我正在尝试构建一个在 EAR 中组装的企业应用程序 该应用程序应包含一个或多个ejb jars以及一个或多个war的 我想大量使用CDI 拦截器和生产者 在第一步中 我想使用日志生产者它被放置在ejb jar在应用程序的所有领域 我所做的是
  • 尝试创建一个圆形菜单

    我正在尝试使用 html 和 css 创建一个带有放射线的圆形菜单 但白色边框构建得不好 而且它在谷歌浏览器中看起来不太好 不像圆圈 我需要获得第 5 项和第 6 项之间的最后一个白色径向 我尝试过下一个代码 DEMO http jsfid
  • 无效的 CRM 2011 LINQ 查询:“‘where’条件无效。实体成员正在调用无效的属性或方法。”

    我正在尝试执行此查询来检索特定实体类型的审核项目 public List
  • 哈希表可以序列化吗?

    我看到一种普遍存在的belief https blogs msdn microsoft com adam 2010 09 10 how to serialize a dictionary or hashtable in c 2009年文章