6

arrメモリ内にタイプのオブジェクトの配列がAあり、それぞれに同じオブジェクトを指す参照フィールドがあるとしますB

図:

A_1  A_2  A_3 ... A_N
 |    |    |       |
 |    |    V       |
 \--->\--> B <-----/

タイプのすべてのオブジェクトの参照フィールドは、タイプの同じオブジェクトをA指していることに注意してください。B

arrここで、型のオブジェクトを含む配列をにシリアル化しAますObjectOutputStream。次に、この方法で取得したバイトを逆シリアル化します。

新しい配列を取得しarr1ます。

1)配列には、すべてが同じタイプのオブジェクトを指すようなarr1タイプのオブジェクトがありますか?(シリアル化前の同じオブジェクトを意味するのではなく、新しく作成された一意のタイプのオブジェクトを意味します)ABB

2)言い換えると、Javaでserialize / deserializeを呼び出すと、シリアル化前と同じオブジェクトグラフが保持されますか?(つまり、古いものと同型の新しく逆シリアル化されたオブジェクトグラフです)

3)これはどこに文書化されていますか?(つまり、引用を提供してください)

4)同じ質問1〜3ですが、JavaのKryoシリアル化フレームワークに適用されます。

ありがとうございました。

4

1 に答える 1

10

http://docs.oracle.com/javase/6/docs/api/java/io/ObjectOutputStream.html

オブジェクトのデフォルトのシリアル化メカニズムは、オブジェクトのクラス、クラスシグネチャ、およびすべての非一時フィールドと非静的フィールドの値を書き込みます。他のオブジェクトへの参照(一時フィールドまたは静的フィールドを除く)により、それらのオブジェクトも書き込まれます。 単一のオブジェクトへの複数の参照は、参照共有メカニズムを使用してエンコードされるため、オブジェクトのグラフは、元のオブジェクトが書き込まれたときと同じ形状に復元できます。

仕様についての私の理解としては、共有されるオブジェクトインスタンスが同じObjectOutputStreamを通過する場合、共有オブジェクト参照を取得します。

したがって、arr配列を含むクラスをシリアル化すると、書き込まれる各オブジェクトはIDを取得し、ストリームを通過する参照ごとに、そのIDのみが書き込まれます。その場合の逆シリアル化されたグラフは、元のグラフと同じままです。

申し訳ありませんが、クリオ語ライブラリ独自のシリアル化メカニズムを手伝うことはできません。それを使用した人からも学ぶことができてとてもうれしいです。

kryoについて編集:

私が見つけたいくつかのドキュメント:

  • デフォルトでは、最初のオブジェクトの後のグラフ内のオブジェクトの各外観は、整数の序数として格納されます。これにより、同じオブジェクトおよび循環グラフへの複数の参照をシリアル化できます。これには少量のオーバーヘッドがあり、不要な場合はスペースを節約するために無効にすることができます。kryo.setReferences(false);

  • これ(github)は、参照リゾルバーのコントラクトです。2つの実装が与えられます:小さなオブジェクトのグラフにはArrayListベース、大きなオブジェクトのグラフにはMapベース

  • これは、デフォルトのオブジェクト配列(デ)シリアライザーの実装です

  • クラスは(逆)シリアル化のために登録する必要があります。登録された各クラスは、シリアライザーと組み合わせることができます(その中で、デフォルトのJavaシリアル化メカニズム

于 2012-09-16T12:35:48.557 に答える