当前位置: 首页 > 知识库问答 >
问题:

序列化Python类

法烨烨
2023-03-14
class bean :
    def __init__(self, puid, pogid, bucketId, dt, at) :
    self.puid = puid
    self.pogid = pogid
    self.bucketId = bucketId
    self.dt = (datetime.datetime.today() - datetime.datetime.strptime(dt, "%Y-%m-%d %H:%M:%S")).days
    self.absdt=dt
    self.at = at

我也读

类、函数和方法不能pickle--如果您pickle,则对象的类不pickle,只是标识它属于什么类的字符串。

那么,这是否意味着这些类不能被序列化?

def myfun():
    **Some Logic **
    t1 = bean(<params>)
    t2 = bean(<params2>)
    temp = list()
    temp.append(t1)
    temp.append(t2)
    return temp

现在它是如何最终被称为

PairRDD.map(myfun).collect()

引发异常的

<function __init__ at 0x7f3549853c80> is not JSON serializable

共有1个答案

佟高澹
2023-03-14

首先,以您的例子为例,pickle将非常有效。pickle不序列化“函数”,它只序列化“数据”--因此,如果您在远程脚本上有您试图序列化的类型,即如果您在接收端导入了类型“bean”--您可以使用pickle或cpickle,一切都可以工作。

所有跨语言序列化解决方案(例如JSONXML)永远不会提供传输类“代码”的能力,因为没有合理的方法来表示它。如果您在两端使用相同的语言(如这里),有方法使其工作-例如,您可以封送对象,pickle结果,发送它,在接收端接收,unpickle和unmarshal,您有一个对象及其函数-这实际上是发送代码和eval()-在接收端将其发送..

下面是一个基于酸洗对象类的快速示例

test.py

import datetime
import pickle

class bean:
    def __init__(self, puid, pogid, bucketId, dt, at) :
        self.puid = puid
        self.pogid = pogid
        self.bucketId = bucketId
        self.dt = (datetime.datetime.today() - datetime.datetime.strptime(dt, "%Y-%m-%d %H:%M:%S")).days
        self.absdt=dt
        self.at = at
    def whoami(self):
        return "%d %d"%(self.puid, self.pogid)

def myfun():
    t1 = bean(1,2,3,"2015-12-31 11:50:25",4)
    t2 = bean(5,6,7,"2015-12-31 12:50:25",8)
    tmp = list()
    tmp.append(t1)
    tmp.append(t2)
    return tmp

if __name__ == "__main__":
    with open("test.data", "w") as f:
        pickle.dump(myfun(), f)
    with open("test.data", "r") as f2:
        obj = pickle.load(f2)
    print "|".join([bean.whoami() for bean in obj])

运行它:

ben@ben-lnx:~$ python test.py 
1 2|5 6
 类似资料:
  • 本文向大家介绍Python pickle类库介绍(对象序列化和反序列化),包括了Python pickle类库介绍(对象序列化和反序列化)的使用技巧和注意事项,需要的朋友参考一下 一、pickle pickle模块用来实现python对象的序列化和反序列化。通常地pickle将python对象序列化为二进制流或文件。   python对象与文件之间的序列化和反序列化: 如果要实现python对象和

  • 问题 你需要将一个Python对象序列化为一个字节流,以便将它保存到一个文件、存储到数据库或者通过网络传输它。 解决方案 对于序列化最普遍的做法就是使用 pickle 模块。为了将一个对象保存到一个文件中,可以这样做: import pickle data = ... # Some Python object f = open('somefile', 'wb') pickle.dump(data

  • " Every Saturday since we’ve lived in this apartment, I have awakened at 6:15, poured myself a bowl of cereal, added a quarter-cup of 2% milk, sat on this end of this couch, turned on BBC America, and

  • 我正在尝试使用kryo序列化和反序列化到二进制。我想我已经完成了序列化,但似乎无法反序列化。下面是我正在处理的代码,但最终我想存储一个字节[],然后再次读取它。文档只显示了如何使用文件。

  • 问题内容: 建议使用保留的字段名称将a序列化为json 的建议方式是什么? 将a 序列化为json只会导致值被序列化,并且字段名称在转换中会丢失。我希望在json大小化时也保留这些字段,因此请执行以下操作: 上面的代码按照我的期望序列化为json,并且在我使用的其他地方(属性访问等)中起作用,除了在迭代过程中出现非元组之类的结果外(对于我的用例来说这很好)。 在保留字段名称的情况下转换为json的

  • 问题内容: 我有一个对象的一部分,希望将其编码为JSON字符串,看起来像。我不在乎客户端的精度,因此浮点数很好。 有一个好的方法可以将此序列化吗?JSONDecoder不接受Decimal对象,并且事先转换为float会产生错误,这将浪费大量带宽。 问题答案: 子类化如何? 然后像这样使用它: