2011-01-29 79 views
2

如何在python中的任务负载中发送类对象?我想发送一个任务参数中的对象。
当我使用simplejson时,出现错误:Object is not serializable
当我使用泡菜时,我得到了KeyValue Error
如何做到这一点?Google App Engine有效载荷对象

这就是我想要序列

class Matrix2D_icfg: 
name = "" 
indices = [] 
value = {} 
def __init__(self,s): 
    self.name = s 
    self.indices = [] 
def __getitem__(self,i): 
    self.indices.append(i) 
    if len(self.indices)==2: 
     (m,n) = self.indices 
     self.indices = [] 
     if self.value.has_key(m*4276+n) == True : 
      value = self.value[m*4276+n] 
     else : 
      value = 0 
     return value 
    else: return self 

def __setitem__(self,i,value): 
    self.indices.append(i)  
    if len(self.indices)==2: 
     (m,n) = self.indices 
     if value != 0 : self.value[m*4276+n] = value 
     self.indices = [] 
    return self 

icfg = Matrix2D_icfg("icfg") #declaring object 
icfg_compress = pickle.dumps(icfg) #to pickle 

icfg = pickle.loads(icfg_compress) # to unload 

我收到以下错误,当我经过腌制对象作为有效载荷和卸载它的类后

File "/Users/praveensekar/myFYP/gaecode/pknots4d.2.3/pknots.py", line 439, in post 
    icfg = pickle.loads(icfg_compress) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/pickle.py", line 1374, in loads 
    return Unpickler(file).load() 
    File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/pickle.py", line 858, in load 
    dispatch[key](self) 
KeyError: '\x00' 
+0

你可以分享你试图序列化的对象的定义吗?我希望`咸菜`工作顺利。 – 2011-01-29 12:15:55

回答

3

的问题是与该被卸下的数据的类型。我铸造它键入str和一切似乎正常工作。 我只是把它改为

icfg = Matrix2D_icfg("icfg") #declaring object 
icfg_compress = pickle.dumps(icfg) #to pickle 

icfg = pickle.loads(str(icfg_compress)) # to unload 
0

这是一个部分我任务排队服务。它只是将一个列表发布到另一个任务上,将项目分解成可管理的部分。这只是它的一部分,但你应该为你需要做的事情获得大部分想法。

要保存:

from django.utils import simplejson as json 

.... stuff happens 

index = 0 
      current_list = [] 
      while index < len(item_list): 
       if index+500 < len(item_list): 
        for item in item_list[index:index+500]: 
         current_list.append(item.item_number) 
        jsondump = json.dumps(current_list) 
        taskqueue.add(url = '/queuer', 
            headers = {'Content-Type':'application/json'}, 
            payload = jsondump) 

要加载:

from django.utils import simplejson as json 

    class TaskQueuer(webapp.RequestHandler): 
    def post(self): 
     request = self.request.body 
     task_list = json.loads(request) 
+0

此方法仅适用于列表。它不适用于类对象 – Sam 2011-01-30 03:54:28

1

你看着的deferred library?它专门为此设计,并为您处理序列化和反序列化。