【问题标题】:Why an instance can not be serialized with JSON?为什么不能用 JSON 序列化实例?
【发布时间】:2014-04-17 04:27:45
【问题描述】:

在过去的几个小时里,我试图解决“不可序列化 JSON”的问题,我对序列化和反序列化实例时的困难部分非常感兴趣。

为什么不能用 JSON 序列化类实例?

要序列化:

  1. 记下类名(以便重建对象)
  2. 注意打包时的变量值。
  3. 将其转换为字符串。
  4. 可以选择压缩它(就像 msgpack 一样)

反序列化:

  1. 创建一个新实例
  2. 将已知值分配给适当的变量
  3. 返回对象。

什么是困难的?什么是复杂数据类型?

【问题讨论】:

  • 为什么要用json序列化一个实例?为什么不泡菜?
  • 我用的是RabbitMQ+pickle,pickle没问题。现在我尝试使用 ZeroRPC,它使用 msgpack,它抱怨我的一个类(我不知道究竟是什么导致了那个错误)。 Msgpack 说“它打包了 Json 打包的所有内容”。 Json 不打包我的实例。好的。我放弃。但我对另一个序列化程序可以实现的难以实现的目标非常感兴趣。

标签: python json serialization deserialization


【解决方案1】:

“硬”部分主要是序列化的第 3 步,将包含的值转换为字符串(然后在反序列化期间返回)

对于像数字、字符串、布尔值这样的简单类型,它非常简单,但对于像连接到远程服务器的套接字或打开的文件描述符这样的复杂类型,它就不能很好地工作了。

解决方案通常是将复杂类型从您要序列化的类型中移出并保持序列化类型非常干净,或者以某种方式标记或以其他方式告诉序列化程序哪些属性应该被序列化,哪些不应该被序列化。

【讨论】:

  • 好的。是什么让打开的文件描述符或套接字变得复杂?它们不能由标准数据类型(int、string...)定义吗?是什么让它们如此复杂?
  • @ceremcem 打开的文件意味着您可以读取 100 个字节,使用打开的文件描述符序列化对象并将其发送到另一台计算机。当另一台计算机反序列化对象并调用 read 读取接下来的 100 个字节时,该文件甚至可能不存在在那里。与插座相同;如果您打开与 google 的连接并向其发送搜索、序列化套接字并在数周后在另一台计算机上对其进行反序列化,您将如何恢复连接以便获得原始套接字上发送的答案?
  • @ceremcem 基本上,状态不完全包含在对象本身(例如操作系统或网络)中的对象至少不能直接序列化,因此序列化程序 - 保持简单- 通常只是放弃。
  • 我们不能只传递数据并让谷歌或我们的班级处理其余的事情吗?也许谷歌甚至会在明年做出回应,或者我们班会尝试重新连接?
  • 抱歉重新发明轮子:我说的是 jsonpickle 的作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-11
  • 2021-04-06
相关资源
最近更新 更多