1

すべての各ノードとエッジをオブジェクト自体で復元してオブジェクト グラフをデシリアライズすると (オブジェクト指向の方法で)、深刻な依存関係の問題があることがわかりました。

たとえば、オブジェクトAが自分自身Aを参照する場合 (自己循環参照) は、復元中A完全な元の状態にあることを期待していることを意味します。連載当時はその状態だったので。

自己参照の場合、それ自体が復元されていることを認識しているため、検出できます。しかし、Aが別のオブジェクトを必要とする場合、他のオブジェクトも完全な元の状態でBあることを期待する必要があります。BオブジェクトがBも参照Aしている場合、再び への循環参照が 発生し、が復元されているAことを知らずに同じ問題が発生します。while デシリアライゼーションの一部のプロパティを使用したい場合、その存在は保証されません。ABA

基本的に、この問題は、オブジェクト自体は不完全な状態にありますが、他のオブジェクトの完全な状態を必要とするために発生します。これは意味がありません。復元プロセスを複数のフェーズに分割することも考えましたが、実際にはすべてのフェーズが終了するまでオブジェクトは不完全な状態のままになるため、実際には違いはありません。

この問題に対するアドバイスや良い解決策を教えてもらえますか?

PS。これをコーディングして、Cocoa のNSKeyedArchiver. したがって、オブジェクトのエンコードはオブジェクト自体によって行われると想定しました。(内部状態について)したがって、一般的なグラフの問題では異なる可能性があります。しかし、オブジェクト自体が取得できる隠し状態を除外することはできません...

4

1 に答える 1

1

あとで参考に…

この質問を投稿した後、この問題についてよく調べました。そして、この問題は根本的に解決できないことに気づきました。(私の場合、各ノードはエッジを非表示にすることができ、各ノードは復元時にそれ自体からエッジ情報を解決する必要があるため、この問題は一般的なグラフとは異なります。)

中心的な問題は依存関係です。すべての各ノードは、逆シリアル化中にアクセスできない元の状態に依存しています。しかし、存在しない状態に依存しない場合は、完全にシリアル化できます。これを保証する唯一の方法は、一般的なグラフ構造を放棄することです。

そこで、すべてのデータ構造をツリー構造に切り替えることにしました。これは構造に大きな制限を与えています。循環的な依存関係がないため、完全に復元されたサブノード情報ですべてのノードを復元できます。

そして、これを見つけました。DAG。http://en.wikipedia.org/wiki/Directed_acyclic_graph これは、子を共有する単なる有向ツリーです。DAG構造もいいと思います。依存関係も完全に解決できるためです。

DAG には大きな制限があります。参照は循環できません。私は弱参照の概念について考えましたが、逆シリアル化するときに完全な元の状態が必要であることは同じです。これは大きな制限ですが、これを堅牢なデシリアライゼーション アルゴリズムとトレードオフすることにしました。私は共有子参照で十分だと思います。実際、堅牢性の低下は私には受け入れられないので、この方法を採用することにしました。

これらのものを使用すると、データ構造を完全にシリアライズ/デシリアライズできると思います。インターネットとウィキペディアに感謝します。

于 2012-07-26T11:05:28.247 に答える