Я работаю над проектом распределенной обработки. Мне нужно отправить свой составной тип данных другому одноранговому узлу, поэтому я могу использовать его в другом узле для заполнения моей структуры TreeView. У меня эти два класса в моем модуле tsk_composite, Мои составные данные node:
class CTskNode(object):
def __init__(self, pData, pParent = None):
self.mData = pData
self.mParent = pParent
self.mChildren = []
Мой основной класс, который отправляет RootNode древовидной структуры:
class CTskComposite(object):
...
def getRootNode(self):
self.getImagePartitions()
return self.mParent
def getImagePartitions(self):
#I use this method to create my parentRoot with recursive function
#it works good
Я отправляю свои составные данные, используя cPickle с этим кодом:
def _composite(self, pArgs):
self.mComposite = CTskComposite(pArgs)
self.mCompositeRootNode = self.mComposite.getRootNode()
return cPickle.dumps(self.mCompositeRootNode)
Когда я получаю составные данные в своем втором одноранговом узле, он выдает это сообщение об ошибке:
ImportError: No module named tsk_composite
Когда я создаю модуль emty с этим именем "tsk_composite" в моем втором одноранговом узле, он дает эту ошибку:
AttributeError: 'module' object has no attribute 'CTskNode'
И когда я только что написал эту строку кода в модуле своего второго эксперта, он отлично работает.
class CTskNode(object):pass
На самом деле мне не нужен этот модуль и класс. Как я могу просто импортировать имя модуля и класса в другой peer с помощью cpickle?
Когда Pickle сериализует объект, он сериализует ditionnary, в котором хранятся имена/значения атрибутов и имя класса (полное имя, с планами модулей), а не определения метода.
При десериализации он воссоздает объект с тем же классом и устанавливает сохраненные атрибуты для этого объекта.
Чтобы повторно создать объект, pickle попытается импортировать класс на стороне клиента, если он не существует, он увеличит исключение, которое вы видели.
Чтобы избежать этого, я вижу 2 решения: