将python对象转换为dicts和其他序列化的一般方法

时间:2014-10-06 15:29:14

标签: python serialization dictionary

我正在编写一个类,用于存储我最终想要对磁盘进行序列化/反序列化的数据。此类的任何对象都可以明确地表示为包含存储在对象属性中的数据的字典。因此,序列化和反序列化金额以将对象转换为字典表示(或使用字典表示初始化新对象),然后使用类似json.dump(),json.read()等的序列化/反序列化dict。 / p>

调用obj.__dict__是不可接受的,因为我用@property装饰器包装公共属性以构建一次写入功能,并将实际值存储在非公共变量中,如{{1 }}。因此,调用_attribute会返回一个字典,其中包含“_attribute”之类的键,这不是我想要的。

建立这样一个班级的“正确”方法是什么?我应该使用obj.__dict__方法(可能是非公开的),还是写一个类obj.to_dict()有效?扩展问题,我应该使用dict(obj)方法,还是编写obj.json_dumps()这样的课程?

我最初的想法是使用json.dumps(obj)方法创建对象的dict表示,然后返回dict的字符串表示,但看起来这种方法需要一个太多的步骤。根据之前的stackoverflow question__repr__应该是对象的明确表示,所以我很高兴__repr__返回字典的字符串表示,但转换dict - > str - > dict似乎是一种非最佳方式。

我正在努力避免糟糕的架构模式,并且我也希望拥有最通用的架构,以便我可以在将来轻松实现其他类型的序列化,例如yaml或pickle。

1 个答案:

答案 0 :(得分:1)

我可能理解你错了,但是你考虑过JSON吗?

with open(output_file, 'w') as ff:
      json.dump(obj, ff)
with open(output_file) as ff:
      obj = json.load(ff)

另一个选项可能是模块PICKLE

with open("mierda.txt", 'w') as ff:
     pickle.dump(a, ff)
with open("mierda.txt") as ff: 
     obj = pickle.load(ff)