为什么Pickle没有序列化我的类数组?

时间:2017-05-24 18:31:03

标签: python python-3.x pickle

我正在尝试使用python的pickle将大量自定义类序列化到磁盘。但是,这些类没有正确序列化。

看了docs我的理解是什么,我应该做的,但也许这不仅仅是因为我不理解某些东西。

我的课程在模块的顶层定义。并且在尝试pickle时没有触发PicklingError异常。

这是我的示例代码。取消注释Save()以序列化;取消注释Load()以加载。加载时,未填充Term的Synonyms数组,但正在反序列化Term的Main对象。您可以通过检查从Load()函数返回的“loadedTerms”对象来看到这一点。

我做错了什么?谢谢。

import pickle

class Entry:
    Text = ""

    def __init__(self, text):
       self.Text = text

class Term:

    Main = None
    Synonyms = []


def Save():
    term = Term()
    term.Main = Entry("Dog")
    term.Synonyms.append(Entry("Canine"))
    term.Synonyms.append(Entry("Pursue"))
    term.Synonyms.append(Entry("Follow"))
    term.Synonyms.append(Entry("Plague"))

    terms = []
    terms.append(term)

    with open('output.pickle', 'wb') as p:
        pickle.dump(terms, p)

def Load():
    loadedTerms = []

    with open('output.pickle', 'rb') as p:
        loadedTerms = pickle.load(p)

    return loadedTerms


#Save()
#terms = Load()

1 个答案:

答案 0 :(得分:2)

Pickle仅保存类的实例属性,但Synonyms是一个在类级别定义的列表。您应该使用__init__方法创建列表:

import pickle

class Entry:
    def __init__(self, text):
       self.Text = text

class Term:
    def __init__(self):
        self.Main = None
        self.Synonyms = []

def Save():
    term = Term()
    term.Main = Entry("Dog")
    term.Synonyms.append(Entry("Canine"))
    term.Synonyms.append(Entry("Pursue"))
    term.Synonyms.append(Entry("Follow"))
    term.Synonyms.append(Entry("Plague"))

    terms = []
    terms.append(term)

    with open('output.pickle', 'wb') as p:
        pickle.dump(terms, p)

def Load():
    with open('output.pickle', 'rb') as p:
        loadedTerms = pickle.load(p)
    return loadedTerms