加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – Hashtables是否可序列化?

发布时间:2020-12-15 23:48:24 所属栏目:百科 来源:网络整理
导读:我在整个互联网上看到一篇普遍的 belief(2009年文章), Hashtable 课程不可序列化;但是,我找不到任何支持这个概念的现代文档. 这种信念源于另一个记录不足的信念,即 IDictionary 界面阻止了序列化;但是,我今天在MSDN中找不到支持此声明的任何内容. 此外,Hasht
我在整个互联网上看到一篇普遍的 belief(2009年文章),Hashtable课程不可序列化;但是,我找不到任何支持这个概念的现代文档.

这种信念源于另一个记录不足的信念,即IDictionary界面阻止了序列化;但是,我今天在MSDN中找不到支持此声明的任何内容.

此外,Hashtable实现了ISerializable并包含接受序列化信息的扩展方法.

那么,这笔交易是什么? Hashtable是否可序列化?哪些文档支持围绕IDictionary的概念?

进一步澄清(请阅读):

大量文档支持IDictionary不可序列化的声明;但是,这侧重于使用基于XML的序列化与类的交互.如下面的注释和MSDN中所提到的ISerializable表示类是可序列化的.它还意味着必须负责其自身序列化的类.

我认为这否定了Hashtable不可序列化的说法.这可能是我的问题的起源.

解决方法

普遍存在的信念是如此普遍,因为它是真的:

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());
}

NotSupportedException: The type System.Collections.Hashtable is not supported because it implements IDictionary.

这并不意味着序列化哈希表几乎是不可能的.当然,我可以遍历所有键和值,将它们写入字符串,然后从中重构哈希表.只是我不能完全使用序列化基础设施.

这是什么原因?它实际上非常简单 – XmlSerializer旨在生成良好的XML,本着XML的交换格式的精神设计.并且XML没有任何类型的字典或“键值”机制.因此,为了支持哈希表序列化,他们必须使用自己的规则制作自己的“子格式”.回到.NET的设计时,这是一个巨大的禁忌 – XML是一种交换格式.对格式的任何扩展(hah)意味着你不再兼容,无论你有多么好的想法.

当然,如今,每个人和他们的祖母都在制作不用于交换目的的XML数据.并不是一件坏事(毕竟,.NET配置文件也是一种XML格式).但它也有点不对劲.

相反,请使用BinaryFormatter之类的东西.这是一个.NET团队设计整个格式的类,并且不受标准的限制.瞧,看看BinaryFormatter可以很好地序列化和反序列化Hashtable.

因此,稍微更正确的信念是“Hashtable无法序列化为有效的标准XML.特别是当您尝试序列化Hashtable时,XmlSerializer类会抛出错误.”

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读