オブジェクト グラフのシリアル化をモジュール方式で実行したいと考えています。つまり、グラフ全体をシリアル化したくありません。その理由は、このグラフが大きいからです。グラフの一部のタイムスタンプ付きバージョンを保持できます。また、遅延アクセスを実行して、現在必要のない部分の読み込みを延期できます。
Pythonのメタプログラミングでこれを管理できると思いました。しかし、Python ではメタプログラミングが十分に強力ではないようです。
これが今のところ私がしていることです。私のグラフは、いくつかの異なるオブジェクトで構成されています。それらのいくつかは、特別なクラスのインスタンスです。このクラスは、ピクルされるルート オブジェクトを記述します。これがモジュール性の出番です。何かをピクルするたびに、それらのインスタンスの1つから始まり、同時に2つをピクルすることはありません。ルート オブジェクトからアクセスできる別のインスタンスへの参照がある場合は常に、この参照を persistant_id に置き換えます。これにより、同じピクル ストリームにそれらが 2 つ含まれないようにします。問題は、ストリームを unpickle するときに発生します。まだロードされていないインスタンスの persistant_id を見つけることができます。この場合、アクセスを許可する前に、ターゲット インスタンスがロードされるのを待つ必要があります。とにかくそれを行う方法がわかりません:
1/ getメソッドが参照のターゲットを返すアクセサを構築しようとしました。残念ながら、アクセサーはクラス宣言に配置する必要があります。それらを unpickled オブジェクトに割り当てることはできません。2/参照を解決する必要がある場所をどこかに保存できます。これは Python では可能ではないと思います: 場所 (フィールドまたは変数) への参照を保持することはできず、値への参照のみを保持することができます。
私の問題は明確ではないかもしれません。私はまだ明確な処方を探しています。「参照」クラスのインスタンスとなる明示的な参照を使用するなど、他のことを試しました。あまり便利ではありませんが。
pickle でモジュラーシリアライゼーションを実装する方法を知っていますか? オブジェクトグラフの残りをロードする必要がある場所を記憶できるように、Unpickler の内部動作を変更する必要がありますか? 同様の結果を達成するのに適した別のライブラリはありますか?