2017-05-24 15 views
0

私は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() 
+0

クラスは名前で処理されます。クラスをピックリングしても状態は保存されません。また、ピクルリング時にクラスの新しいコピーを生成したり、クラスの状態を復元したりすることはありません。 – user2357112

+0

あなたのクラスの定義があなたが思っていることをやっていないことを確かめてください。しかし、私が知る限り、あなたの 'シノニム'属性*には人が住んでいます –

+0

私はまだ混乱しています。私は高密度であることをお詫びします。それでオブジェクトを漬けていくのはいいのですか?そして、なぜそれが "メイン"オブジェクトを(私はそれをデシリアライズすることができます)酸洗しますが、配列のシノニムの要素ではありません。 しかし、次の例では、クラス属性attrがunpickle環境で復元されないことに注意してください。クラスのインスタンスがpickle化されるときに、クラスのコードとデータは一緒にピクルされません。インスタンスのデータのみがピクルされます。 –

答えて

2

ピクルスは、クラスのインスタンスの属性を保存しますが、Synonymsはクラスレベルで定義され、リストです。 __init__ -methodにリストを作成する必要があります。

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 
+0

お返事いただきありがとうございます。これは意味があります。最後の1つの質問: "シノニム"はクラスレベルで定義されたリストです。しかし、メインは私の例ではクラスレベルでも定義されていませんか? –

+0

インスタンス属性として 'Save'の2行目に' Main'を再定義します。 – Daniel

+0

ああ!ですから、クラスレベルで宣言されている同義語は、.append()呼び出しで明示的に参照するためですが、私はそれを何かと等しく設定して再定義します。 よろしいですか?あなたは私がまだpythonで非常に緑色だと言うことができます。私の背景はC言語の世界です。そのような有益な方法で私の質問に答える時間を取っていただき、ありがとうございます。 –

関連する問題