«

»

C#中Hashtable的序列化

c# 哈希表 序列化序列化就是把一个对象保存到一个文件或存储对象中去,有时也翻译为持久化,最早甚至见过书籍翻译成串行化。序列化可以保存对象的状态,在进程下次启动时完整恢复。也可以用来传递数据,比如将数据序列化成标准化或可交换的数据格式,如XML或JSON等,以供进程内或进程间通信使用。比如C#中的一个实例化的对象,就可以在程序退出前将之序列化到磁盘文件里,然后下次运行时重新读出。

C#中有三种序列化方式:XmlSerializer,SoapFormatter,BinaryFormatter中。序列化为文件之后的可读性,顺序为从前到后。但悲剧的是,xml方式不支持Hashtable,因Hashtable实现了IDictionary接口。在序列化时会抛出这个异常。

SoapFormatter方式,需要手工引入System.Runtime.Serialization.Formatters.Soap这个dll,其生成的文件,有一定的可读性。

而BinaryFormatter生成的,则是纯粹的二进制文件。

在本人实践中,序列化一个Hashtable,元素类型为class,class按要求用[Serializable]加以声明。但在BinaryFormatter序列化成文件时,虽无报错,但在反序列化时,一直报“System.Runtime.Serialization.SerializationException: 在分析完成之前就遇到流结尾。”的错误。确认class中都是public成员,并将文件流的fs.position置为0也无作用。而在换用SoapFormatter序列化时,报出了明确的错误原因:“System.Threading.Timer类型未被标记为可序列化。”

起因是作为Hashtable的结点的类定义中有个System.Threading.Timer类型成员,虽然类被注明为[Serializable],但System.Threading.Timer是不支持序列化的,事实上System.Threading.Timer的序列化也无意义。将此成员的前面标注为不可序列化:[NonSerializedAttribute]。然后再次执行SoapFormatter序列化,成功,再换用BinaryFormatter序列化,亦成功。

1 星2 星3 星4 星5 星 (尚无评分)
Loading...Loading...

相关文章

C#中Hashtable的顺序遍历及列表控件的insert方法 在.NET中,Hashtable是System.Collections命名空间提供的一个容器,用于处理类似keyvalue的键值对。将一...
AssemblyVersion和AssemblyFileVersion的区别 在VS .net项目属性的程序集信息里,有程序集版本和文件版本,这两者有何区别呢?简而言之,AssemblyVers...
两段自动检测网页编码的C#代码 使用C#访问网页时,如何检测网页的编码是必须解决的问题。实测下面两段代码并不是百分百可靠,某些页面...
DataGridView控件的AutoSize 模式不能设置为 Fill 在C#中将DataGridView控件的AutoSizeColumnsMode设为Fill时,出现错误提示:列 AutoSize 模式不能设置为...
一个C#提取a标签的href及innerhtml的正则 正则表达式主要用于文本处理,其特点是灵活性、逻辑性和功能性非常的强,可以迅速地用极简单的方式达到...
C#在HttpWebRequest中增加Header 许多具有跨平台能力的语言的最大缺憾,是对不同操作系统下图形界面编程支持不佳。这其实也很好理解,不...
在C#的form构造函数中结束程序的问题 编写一个Windows窗体程序,准备在form()中读取配置,若配置文件不存在,则退出程序。此处使用了applicat...
OpenFileDialog导致BinaryFormatter失效? 编写一个C#窗体程序时,为了省事,直接用BinaryFormatter.Serialize来保存程序的配置。配置文件名不含路...

发表评论

电子邮件地址不会被公开。