Python:如何json序列化类引用,而不是类实例

时间:2017-03-25 07:13:05

标签: python json class serialization reference

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

例如,如果我这样做

class Foo:
   pass
json.dumps(Foo)

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

1 个答案:

答案 0 :(得分:0)

有点晚了,但实际上你无法直接序列化一个类。序列化是将对象转换为字符串以进行存储和传输的行为。在你的情况下,类声明Foo已经是一个文本文件; Foo.py(或者你把它放在哪里)。

序列化库通常将对象的类保留在引用中,以便同一个程序quand保存并加载一个对象,并且仍然知道它是一个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的全部内容时回答我所知道的事情!