您不能使用序列化任意对象
simplejson。您需要将
default和传递
object_hook给
dump和
load。这是一个例子:
class SerializerRegistry(object): def __init__(self): self._classes = {} def add(self, cls): self._classes[cls.__module__, cls.__name__] = cls return cls def object_hook(self, dct): module, cls_name = dct.pop('__type__', (None, None)) if cls_name is not None: return self._classes[module, cls_name].from_dict(dct) else: return dct def default(self, obj): dct = obj.to_dict() dct['__type__'] = [type(obj).__module__, type(obj).__name__] return dctregistry = SerializerRegistry()@registry.addclass A(object): def __init__(self, item1): self.item1 = item1 def __repr__(self): return str(self.__dict__) def to_dict(self): return dict(item1=self.item1) @classmethod def from_dict(cls, dct): return cls(**dct)s = json.dumps(A(1), default=registry.default)a = json.loads(s, object_hook=registry.object_hook)结果是:
>>> s'{"item1": 1, "__type__": ["__main__", "A"]}'>>> a{'item1': 1}但是,您真正需要的是一个
default从希望序列化的对象创建字典的函数,以及一个
object_hook如果字典不够用的函数,当给定字典时,该对象将返回一个(正确类型的)对象。最好的方法是在可序列化类上具有从对象创建字典并将其构造回去的方法,并且还具有识别字典所属的类的映射。
您还可以将标识符添加到类中,以用作的索引
_classes。这样,如果您要上课,就不会有问题。



