2011-05-23 58 views
4

我有一个简单的例子来送字典通过XML-RPC:XML-RPC - 不能元帅递归字典

class CTest(object): 
    def __init__(self): 
     self.node1 = {'data':'zek', 'parent':{}, 'children':[]} 
     self.node2 = {'data':'bill', 'parent':{}, 'children':[]} 
     self.node1['children'].append(self.node2) 
     self.node2['parent'] = self.node1 

    def getNode(self): 
     return self.node1 

我有两个字典:节点2是节点1的儿童,并在同一时间节点2将node1作为父变量的引用。 所以它是一个递归字典。当我尝试通过XML-RPC发送节点1,我得到这个异常:

#Command to execute xml-rpc dump method for serialization 
test = CTest() 
xmlrpclib.dumps((test,), 'Node Object') 
#Exception 
raise TypeError, "cannot marshal recursive dictionaries" 

是否有可能通过XML-RPC发送节点1(不改变字典结构)?

谢谢。

回答

3

使用Python的'pickle'模块对'test'进行序列化和反序列化。

cPickle.dumps(test) 

正在工作。在网线的另一侧使用

cPickle.loads(received_test_pickle) 

这可能是必要的Base-64编码/解码之前咸菜/ XMLRPC的电话后。

但也考虑火焰兵

http://pyro.sourceforge.net/

+0

感谢。它与cPickle完美配合。但它需要与语言无关。 因此,当我在一个对等体上腌制字典时,我还需要在其他对等体中使用python来取消它。 因为我以xml格式发送字典,所以通常可以在另一个同位体(C,C++,java)中使用另一种编程语言。 这就是为什么我不能使用pickle。 Pyro有它自己的网络通信代码,它不使用XML-RPC。我需要使用XML-RPC。 那么你知道任何其他的方法来发送这本字典通过XML-RPC没有泡菜吗? – zekifh 2011-05-24 13:29:07