Основные изменения класса между сериализацией и десериализацией - PullRequest
0 голосов
/ 27 февраля 2019

В какой-то момент жизни программы создается объект testclass, который затем сериализуется в файловой системе с использованием pickle или h5py.Теперь в течение этого периода определение testclass обновляется.Обновление всегда касается добавления новых полей (а не удаления существующих).

Правильно ли десериализован сохраненный класс и ссылки на него с использованием обновленного определения testclass?

До сериализации: Класс определен

class testclass:
    __fieldA = None
    __fieldB = None
    __fieldC = 'Hello'
    def __init__(self, A, B):
        self.__fieldA = A
        self.__fieldB = B
    def setA(self, A):
        self.__fieldA = A
    def getA(self):
        return self.__fieldA
    def setB(self, B):
        self.__fieldB = B
    def getB(self):
        return self.__fieldB
    def setC(self, C):
        self.__fieldC = C
    def getC(self):
        return self.__fieldC

>>>orig_obj = testclass('testA', 'testB')
>>>isinstance(orig_obj, testclass)
>>>True
>>>with open('test', 'wb') as handle:
      pickle.dump(orig_obj, handle, protocol=pickle.HIGHEST_PROTOCOL)

После сериализации: Определение класса изменено

class testclass:
    __fieldA = None
    __fieldB = None
    __fieldC = 'Hello'
    __fieldD = 10
    def __init__(self, A, B):
        self.__fieldA = A
        self.__fieldB = B
    def setA(self, A):
        self.__fieldA = A
    def getA(self):
        return self.__fieldA
    def setB(self, B):
        self.__fieldB = B
    def getB(self):
        return self.__fieldB
    def setC(self, C):
        self.__fieldC = C
    def getC(self):
        return self.__fieldC
    def setD(self, D):
        self.__fieldD = D
    def getD(self):
        return self.__fieldD

>>>with open('test', 'rb') as handle:
       loaded_obj = pickle.load(handle)
>>>isinstance(loaded_obj, testclass)
>>>False

Теперь loaded_obj не является экземпляром testclass.Это имеет смысл и не имеет никакого отношения к тому, введено ли новое поле __fieldD или нет.

В этом сценарии, каков наилучший способ убедиться, что loaded_obj является экземпляром testclass

...