1. 苏葳的备忘录首页
  2. 编程

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序列化,亦成功。

原创文章,作者:苏葳,如需转载,请注明出处:https://www.swmemo.com/493.html

发表评论

邮箱地址不会被公开。 必填项已用*标注