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