Отправка составного типа данных с помощью XML-RPC с помощью cPickle - PullRequest
1 голос
/ 02 мая 2011

Я работаю над проектом распределенной обработки. Мне нужно отправить составной тип данных другому узлу, чтобы я мог использовать его в другом узле, чтобы заполнить структуру TreeView. У меня есть эти два класса в моем модуле "tsk_composite", Мой узел составных данных:

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

На самом деле мне не нужен этот модуль и класс. Как я могу просто импортировать имя модуля и класса в другой узел с помощью cpickle?

1 Ответ

4 голосов
/ 02 мая 2011

Когда Pickle сериализует объект, он сериализует дополнительный файл, в котором хранятся имена / значения атрибутов и имя класса (полное имя, с модулями), а не определения метода.

При десериализации он воссоздает объект стот же класс и установить сохраненные атрибуты для этого объекта.

Чтобы заново создать объект, попытайтесь импортировать класс на стороне клиента, если он не существует, он вызовет исключение, которое вы видели.

Чтобы избежать этого, я вижу 2 решения:

  • Вы должны сделать источники доступными для вашего клиентского модуля, поэтому при отборе объектов он найдет источники.
  • вы можете заново создать фиктивный модуль (с тем же путем, именем класса и атрибутами) (если единственная потребность этих объектов - это атрибуты)
...