【问题标题】:Google App Engine Payload ObjectGoogle App Engine 负载对象
【发布时间】:2011-06-17 17:26:03
【问题描述】:

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

这是我要序列化的类

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'  

【问题讨论】:

  • 你能分享你想要序列化的对象的定义吗?我希望pickle 能够顺利工作。

标签: python json google-app-engine pickle task-queue


【解决方案1】:

这是我的任务排队服务的一部分。它只是将列表发布到另一个任务,以将项目分解为可管理的部分。这只是其中的一部分,但您应该了解您需要做什么的大部分想法。

保存:

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)

【讨论】:

  • 此方法仅适用于列表。它不适用于类对象
【解决方案2】:

问题在于卸载的数据类型。我将它转换为 str 类型,一切似乎都正常工作。 我只是把它改成

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

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

【讨论】:

    【解决方案3】:

    你看过deferred library吗?它正是为此而设计的,并为您处理序列化和反序列化。

    【讨论】:

      猜你喜欢
      • 2013-07-11
      • 2012-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多