私はPythonのpickleを使って多数のカスタムクラスをディスクにシリアル化しようとしています。ただし、クラスは適切にシリアル化されていません。Pickleがクラスの配列をシリアル化しないのはなぜですか?
docsを見ていると、私は何をしようとしているのか理解していますが、それは単に何かを理解していないからではありません。
私のクラスは、モジュールのトップレベルで定義されています。ピクルをしようとすると、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()
クラスは名前で処理されます。クラスをピックリングしても状態は保存されません。また、ピクルリング時にクラスの新しいコピーを生成したり、クラスの状態を復元したりすることはありません。 – user2357112
あなたのクラスの定義があなたが思っていることをやっていないことを確かめてください。しかし、私が知る限り、あなたの 'シノニム'属性*には人が住んでいます –
私はまだ混乱しています。私は高密度であることをお詫びします。それでオブジェクトを漬けていくのはいいのですか?そして、なぜそれが "メイン"オブジェクトを(私はそれをデシリアライズすることができます)酸洗しますが、配列のシノニムの要素ではありません。 しかし、次の例では、クラス属性attrがunpickle環境で復元されないことに注意してください。クラスのインスタンスがpickle化されるときに、クラスのコードとデータは一緒にピクルされません。インスタンスのデータのみがピクルされます。 –