修改python jsonpickle源码, 实现不序列化对象私有成员(3)

发现之前修改源码后, 虽然过滤掉对象的私有成员, 但是反序列化的时候, 发现生成的对象只有只有公有成员, 不包括私有成员. 这不是我想要的, 因为没有私有成员, 对象就不完整了, 并且有时候还需要一些私有成员的默认值.
所以, 还需要再优化一下.
修改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>}
可见私有变量也被正确创建了.

posted @ 2024-12-20 13:41  顺其自然,道法自然  阅读(5)  评论(0编辑  收藏  举报