发现之前修改源码后, 虽然过滤掉对象的私有成员, 但是反序列化的时候, 发现生成的对象只有只有公有成员, 不包括私有成员. 这不是我想要的, 因为没有私有成员, 对象就不完整了, 并且有时候还需要一些私有成员的默认值.
所以, 还需要再优化一下.
修改unpickler.py
文件的def _restore_object_instance(self, obj, cls, class_name=''):
函数:
#instance = cls.__new__(cls, *args, **kwargs)
instance = cls(*args, **kwargs)
注释掉的代码使用cls.__new__
来创建类的实例, 它不会调用类的__init__
函数, 所以不会初始化私有变量. 所以我们修改一下, 采用正常的方式创建类的实例, 然后再用之前存储的json数据反序列化覆盖成员变量的值.
效果
示例代码:
#import jsonpickle
import my_pickle
class InnerClass:
def __init__(self):
self.public_var = '哈哈'
self._private_var = 20
class OuterClass:
def __init__(self):
self.public_var = 100
self._private_var = 200
self.inner = InnerClass() # 嵌套对象
obj = OuterClass()
#obj = {'hzqtest':10,'_abc':100}
#json_str = my_pickle.encode(obj,filter_func=test)
#my_pickle.obj2file(obj,'hzqtest.json')
obj2 = my_pickle.file2obj('hzqtest.json')
print(vars(obj2)) # 输出应仅包含 public_var
输出:
{'public_var': 100, '_private_var': 200, 'inner': <__main__.InnerClass object at 0x0000019045C8FB00>}
可见私有变量也被正确创建了.