为什么实例不能被JSON序列化?
我这几小时一直在解决“无法序列化为JSON”的问题,所以我对序列化和反序列化一个实例时的难点很感兴趣。
为什么一个类的实例不能被序列化,比如说用JSON?
序列化的过程是这样的:
- 记录类的名称(为了以后能重建这个对象)
- 记录打包时变量的值。
- 把这些信息转换成字符串。
- 可选地进行压缩(就像msgpack那样)
反序列化的过程是:
- 创建一个新的实例
- 把已知的值赋给相应的变量
- 返回这个对象。
那么,难点在哪里呢?什么是复杂数据类型?
1 个回答
0
这里的“难点”主要是在你序列化的第三步,就是把里面的值转换成字符串(之后在反序列化的时候再转换回来)。
对于简单的类型,比如数字、字符串和布尔值,这个过程相对简单明了。但如果是复杂的类型,比如连接到远程服务器的套接字或者一个打开的文件描述符,这样的处理就不太好用了。
解决这个问题的办法通常有两个:要么把复杂类型从你想要序列化的类型中移除,保持序列化的类型非常干净;要么以某种方式标记或者告诉序列化工具,哪些属性应该被序列化,哪些不应该。