Python继承模式——如何处理反序列化

标签 python serialization deserialization

假设我们要序列化下面的 B:

import json
class A:
    def __init__(self):
        self.a = 1
    @classmethod
    def serialize(cls, t):
        with open('temp_A.json', 'wb') as f:
            json.dump({'a':t.a}, f)
    @classmethod
    def deserialize(cls):
        with open('temp_A.json', 'rb') as f:
            d = json.load(f)
            obj = A()
            obj.a = d['a']
            return obj

class B(A):
    def __init__(self):
        super(B, self).__init__()
        self.b = 2
    @classmethod
    def serialize(cls, t):
        with open('temp_B.json', 'wb') as f:
            json.dump({'b':t.b}, f)
    @classmethod
    def deserialize(cls):
        with open('temp_B.json', 'rb') as f:
            d = json.load(f)
            obj = B()
            obj.b = d['b']
            a = A.deserialize()
            #### IMPORTANT: doesn't work
            super(B, b) = a
            ####
            return b

如果这种序列化模式很糟糕并且您有其他选择,请告诉我。但是,在当前阶段,我不确定如何将父类(super class)的成员变量重新分配为 a 的属性(因为 a 的状态可能与期间不同)初步 build )。我知道我可以做类似 super(B,b).__dict__ = a.__dict__ 的事情,但感觉不太对。 执行此类操作的Python惯用方法是什么?

最佳答案

pickle借用dunders :

import json
class A:
    def __init__(self):
        self.a = 1

    def __getstate__(self):
        return {'a': self.a}

    def __setstate__(self, state):
        '''Accepts a json/dict, sets member attributes accordingly'''
        self.a = state['a']

    def serialize(self):
        return json.dumps(self.__getstate__())

    @classmethod
    def deserialize(cls, json_str):
        d = json.loads(json_str)
        obj = cls()
        obj.__setstate__(d)
        return obj

class B(A):
    def __init__(self):
        super(B, self).__init__()
        self.b = 2

    def __setstate__(self, state):
        '''Accepts a json/dict, sets member attributes accordingly'''
        super().__setstate__(state)
        self.b = state['b']

    def __getstate__(self):
        state = super().__getstate__()
        state.update({'b': self.b})  # or state['b'] = self.b
        return state

    def serialize(self):
        return json.dumps(self.__getstate__())

    @classmethod
    def deserialize(cls, json_str):
        d = json.loads(json_str)
        obj = cls()
        obj.__setstate__(d)
        return obj


# Test A roundtrip
a1 = A()
a1_str = a1.serialize()
print(a1_str)               # {"a": 1}

a2 = A.deserialize(a1_str)
a2_str = a2.serialize()
print(a2_str)               # {"a": 1}

print(a1_str == a2_str)     # True

# Test B roundtrip
b1 = B()
b1_str = b1.serialize()
print(b1_str)               # {"a": 1, "b": 2}

b2 = B.deserialize(b1_str)
b2_str = b2.serialize()
print(b2_str)               # {"a": 1, "b": 2}

print(b1_str == b2_str)     # True

这里还有一些其他更改,例如不在 deserialize() 类方法中对类名进行硬编码、序列化为字符串而不是文件(用于测试)、使用一致的转储 code>/加载,而不是每个加载一个。

关于Python继承模式——如何处理反序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51107600/

相关文章:

c# - 如何确定类是否具有 DataContract 属性?

python - 将变量作为参数传递给 networkx.add_edge() 属性

python - 如何按两列值之间的行对 pandas 数据框进行切片?

serialization - 如何在Django的序列化程序中更改字段名称

jquery - 在 jquery 对话框中加载表单会导致空的 serialize()

json - 如何在自定义反序列化器 Spring Boot 中读取路径变量或 URL 参数

java - 如何在 Gson 反序列化中折叠嵌套结构?

python - 在文本文件上书写,重音和特殊字符显示不正确

python - nltk 的 RegexpParser 中的递归

ios - NSDictionary 序列化为 NSString