【问题标题】:Python: How to json serialize class reference, not the class instancePython:如何 json 序列化类引用,而不是类实例
【发布时间】:2017-08-18 05:25:26
【问题描述】:

我想序列化类本身而不是对象实例。

例如,如果我这样做

class Foo:
   pass
json.dumps(Foo)

它会抛出一个错误,说 Foo 不是 JSON 可序列化的。 甚至可以用python做到这一点吗?

【问题讨论】:

  • 当你“序列化”一个类时你期望收到什么?
  • 我想你的意思是你想使用shelvespickle
  • github.com/tschellenbach/Stream-Framework 这个框架通过编写的类来完成 celery 任务。在他们使用pickle的框架中,但我想使用json,因为芹菜支持json。在框架中,他们将序列化的类引用发送到 celery。希望这能解释
  • @abccd 不,我不这么认为
  • 您希望示例的输出是什么?

标签: python json class serialization reference


【解决方案1】:

有点晚了,但你实际上不能直接序列化一个类。序列化是将对象转换为字符串以进行存储和传输的行为。一个类声明,在你的例子中 Foo,已经是一个文本文件; Foo.py(或任何你放的地方)。

序列化库通常会引用对象的类,以便同一个程序在保存和加载对象的同时仍然知道它是一个 Foo 实例。但是,如果我编写自己的不包含 Foo 类的小应用程序,那么反序列化您的数据会给我一些几乎没有用的东西。

根据你想做什么,有其他选择。

  • 如果您的目标是保存或传输方法而不是数据(因为类声明通常是方法之一,不像类实​​例,它由信息组成,包含在属性和变量中),那么您可以序列化函数或包含方法的动态对象。任何反序列化数据的程序都可以理解这些,并且可以正确运行这些功能。在没有对数据进行事实检查的情况下反序列化实际上是一种安全风险,因为您可能会将破坏性方法传输给毫无戒心的程序。
  • 如果您的目标是传输数据类型,那么您可能不得不考虑传输整个程序。如前所述,序列化的目标是保存或传输数据。如果您想保存或传输功能,请考虑保存在硬盘上的代码已经是功能的字符串表示;你可以传输你的整个程序。此外,还有一些库可以将您的代码转换为可执行文件,以防目标计算机不支持 python。
  • 第三种选择,也是我最终在 Stack Overflow 上找到此问题的一半原因是将您的数据结构化为数据库条目。这仅适用于您的目标是将对象保存或传输为“形状”或结构,而不是作为一堆功能和操作。换句话说,这假设您的目标是传递一个 Contact 类由姓名、电话号码和地址组成的事实。

对于最后一个选项,您在某种程度上想要构建一个类:

Class model:
    def __init__(self, class_name, fields):
        self.class_name = class_name
        self.fields = fields

Class model_instance:
    def __init__(self, model, values):
        self.fields = {}
        # add values to the dict with fields as keys, based on the model
        ...

当你实例化一个“模型”时,你实际上是在创建一个对象的模型。然后会有多种技巧来正确实现一个替代的实例化系统,在这一点上,需要进行一些研究。

我知道这篇文章有点老了,但我认为在搜索我不知道的内容时回答我所知道的内容是 Stack Overflow 的全部意义!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-02
    • 1970-01-01
    • 2021-07-22
    • 1970-01-01
    • 2022-06-15
    • 2020-12-01
    相关资源
    最近更新 更多