Отправка составного типа данных с помощью XML-RPC с помощью cPickle

1

Я работаю над проектом распределенной обработки. Мне нужно отправить свой составной тип данных другому одноранговому узлу, поэтому я могу использовать его в другом узле для заполнения моей структуры 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
importerror
composite
xml-rpc

1 ответ

4
Лучший ответ

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

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

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

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

  • вам нужно сделать источники доступными для вашего клиентского модуля, поэтому при распаковке объектов он найдет источники.
  • вы можете повторно создать фиктивный модуль (с тем же путем, именем класса и атрибутами) (если нужны только эти объекты, это атрибуты hanlding)
  • 0
    Спасибо за ваш быстрый ответ. Но я не могу сделать мои источники доступными для моего клиента, и это не кажется хорошим способом создать фиктивный модуль, который мне действительно не нужен. Есть ли у вас какие-либо другие предложения по отправке данных от одного узла другому с помощью XML-RPC, кроме pickle?
  • 2
    Вы можете попробовать отправить словарь, составленный из атрибутов name и values, этого должно быть достаточно.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню