当前位置: 首页 > 编程语言 > C#

Hashtables是可序列化的吗?Share

时间:2023-04-10 19:07:54 C#

哈希表是可序列化的吗?我在互联网上看到一个普遍的看法(2009年的文章),即Hashtable类不可序列化;但是,我找不到任何支持这个概念的现代文档。这种信念源于另一个模糊的信念,即IDictionary接口会阻止序列化;然而,我今天在MSDN中找不到任何支持这种说法的东西。此外,Hashtable实现ISerializable并包含接受序列化信息的扩展方法。那么,这是怎么回事?哈希表是可序列化的吗?哪些文档支持IDictionary概念?进一步说明(请阅读):有大量文档支持IDictionary不可序列化的声明;但是,这侧重于使用基于XML的序列化与类进行交互。下面的评论和MSDN中提到的ISerializable表示该类是可序列化的。它还意味着类必须负责自己的序列化。我认为这否定了Hashtable不可序列化的说法。这可能是我问题的根源。普遍的信念是如此普遍,因为它是真的:vart=newHashtable();t.Add("嗨!","我在这里");t.Add("嗯","是的");varserializer=newXmlSerializer(typeof(Hashtable));使用(varsw=newStringWriter()){serializer.Serialize(sw,t);Console.WriteLine(sw.ToString());}抛出NotSupportedException:不支持System.Collections.Hashtable类型,因为它实现了IDictionary。这并不意味着序列化哈希表几乎是不可能的。当然,我可以遍历所有键和值,将它们写入字符串,并从中重建哈希表。只是我不能完全使用序列化基础设施。是什么原因?它实际上非常简单——XmlSerializer旨在生成良好的XML,其设计本着XML的交换格式的精神。并且XML没有任何适当的字典或“键值”机制。因此,为了支持哈希表序列化,他们必须使用自己的规则制作自己的“子格式”。在设计.NET时,这是一个巨大的禁忌——XML是一种交换格式。对格式的任何扩展(hah)都意味着您不再兼容,无论您的想法多么好。现在,当然,每个人和他们的祖母都在生成不用于交换目的的XML数据。这不是一件坏事(毕竟,.NET配置文件也是一种XML格式)。但这也有点不对。相反,采用BinaryFormatter的东西。这是.NET团队设计整个格式的类,独立于标准。看看-BinaryFormatter可以很好地序列化和反序列化Hashtable。因此,稍微更正确的信念是“Hashtable无法序列化为有效的标准XML。特别是,当您尝试序列化Hashtable时,XmlSerializer类会抛出错误。Hashtable是否实现ISerializable?绝对:publicclassHashtable:IDictionary,ICollection,IEnumerable,ISerializable,IDeserializationCallback,ICloneable我们可以将Hashtable序列化为XML吗?让我们试试:varhash=newSystem.Collections.Hashtable();散列[7]="7";散列[8]="8";varserializer=newSystem.Xml.Serialization.XmlSerializer(typeof(System.Collections.Hashtable));TextWriterwriter=newSystem.IO。StreamWriter(@"C:SomeFile.xml");serializer.Serialize(writer,hash);结果...错误System.Xml.dll中出现类型“System.NotSupportedException”的异常,但未出现在用户代码中处理中的附加信息:不支持System.Collections.Hashtable类型,因为它实现了IDictionary.所以,它看起来确实如此,它在.Net4.5+中仍然如此,但让我们再次尝试二进制序列化......varhash=newSystem.Collections.Hashtable();散列[7]="7";散列[8]="8";varformatter=newSystem.Runtime.Serialization.Formatters.Binary.BinaryFormatter();Streamstream=newFileStream(@"C:SomeFolderSomeFile.bin",FileMode.Create,FileAccess.Write,FileShare.None);格式化程序。序列化(流,散列);stream.Close();结果...没有抛出错误...所以问题似乎出在IDictionary和XmlSerialization上,但不是所有的序列化.com/adam/2010/09/10/how-to-serialize-a-dictionary-or-hashtable-in-C/此外,有趣的是,XML序列化提到您不能序列化无符号长整数或集合。MicrosoftXMLSerialization(MSDN)Microsoft似乎说它绝对有可能做到这一点。https://msdn.microsoft.com/en-us/library/b85344hz(v=vs.110).aspx使用系统;使用System.IO;使用系统集合;使用System.Runtime.Serialization.Formatters.Binary;使用System.Runtime.Serialization;公共类App{[STAThread]staticvoidMain(){Serialize();反序列化();}staticvoidSerialize(){//创建一个最终将被序列化的哈希表。哈希表地址=newHashtable();addresses.Add("Jeff","123MainStreet,Redmond,WA98052");addresses.Add("Fred","987PineRoad,Phila.,PA19116");addresses.Add("Mary","POBox112233,PaloAlto,CA94301");//要序列化哈希表及其键/值对,//您必须首先打开一个流进行写入。//在这种情况下,使用文件流。FileStreamfs=newFileStream("DataFile.dat",FileMode.Create);//构造一个BinaryFormatter并使用它来将数据序列化到流中。BinaryFormatter格式化程序=newBinaryFormatter();尝试{formatter.Ser初始化(fs,地址);}catch(SerializationExceptione){Console.WriteLine("序列化失败。原因:"+e.Message);扔;}最后{fs.Close();}}staticvoidDeserialize(){//声明哈希表引用。哈希表地址=空;//打开包含要反序列化的数据的文件。FileStreamfs=newFileStream("DataFile.dat",FileMode.Open);尝试{BinaryFormatter格式化程序=newBinaryFormatter();//反序列化文件中的哈希表并//将引用分配给局部变量。地址=(Hashtable)formatter.Deserialize(fs);}catch(SerializationExceptione){Console.WriteLine("反序列化失败。原因:"+e.Message);扔;}最后{fs.Close();}//为了证明表反序列化正确,//显示键/值对。foreach(DictionaryEntrydeinaddresses){Console.WriteLine("{0}住在{1}。",de.Key,de.Value);}}}上面说的就是C#学习教程:Hashtables是不是可序列化?分享的全部内容,如果对大家有所用处且需要了解更多C#学习教程,希望大家多多关注~本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: