2017-01-01 92 views
0

Javaでのシリアライゼーションを勉強しているうちに、「オブジェクトの全オブジェクトグラフがシリアル化されている間にこの文が出てきました。この場合の非直列化とその理由は何ですか?Javaでのシリアライゼーション中のオブジェクト間の循環依存性

+0

私はあなたの希望が見つかりましたこれは役立ちますhttp://softwareengineering.stackexchange.com/questions/151055/what-happens-if-we-serialize-and-deserialize-two-objects-which-references-to-eac – SmashCode

+2

Javaシリアライゼーション・サブシステムはサイクルを考慮します。同じオブジェクトへの複数の参照。他の興味深いものについては。オブジェクトが正常にシリアル化された場合、それをデシリアライズすると、グラフが元のオブジェクトと等価なオブジェクトが生成されます。しかし、詳細はこの会場では広すぎる。 –

+1

事実、@MouseEvent、あなたが発見したように、私は間違っていません。疑わしい人のための[シンプルなデモンストレーション](http://ideone.com/zo47zc)があります。私は確かに被験者をはるかに深く扱うことができますが、私が言ったように、完全な詳細は広すぎるためです。 –

答えて

1

Javaシリアライゼーションは、「ハンドル」システムを介して循環オブジェクトグラフを処理します。以前にシリアライズされたオブジェクトは再シリアライズされません。代わりに、そのオブジェクトに対する 'ハンドル'がシリアライズされます。シリアライズされたオブジェクトは同じオブジェクトを参照するためにデシリアライズ時に再構成されます。 Object Serialization Specification #1.2を参照してください。

+0

私は同じ手順について考えていました。オブジェクトがすでにストリーミングに書き込まれている場合は、戻ってどこにあるのかを調べ、ここでその参照を渡します。 – omjego

+0

これは同じ手順ではありません。あなたが何を記述すれば、2つのオブジェクトが作成されます。 – EJP

+0

2つ以上のオブジェクトをどのように作成しますか?前にシリアライズされたコピーは1つだけあり、シリアライズのためにもう一度やってくるならば、ストリームの前にすでに書かれているかどうかを調べるでしょう。そうでなければ "handle"をシリアライズします。 – omjego