ツリーやリンク リストなど、ポインターを含むデータ構造のシリアル化はどのように機能しますか?
私がこの疑問を抱く理由は、ポインタがノードのメモリアドレスを格納しているためです。また、シリアル化に続いて逆シリアル化すると、それらが同じメモリ位置にロードされるという保証はありません。また、シリアル化されたデータがネットワークを介して別のシステムに送信される場合も、同じ問題が発生します。
では、どのように機能しますか (もし機能する場合)?
ツリーやリンク リストなど、ポインターを含むデータ構造のシリアル化はどのように機能しますか?
私がこの疑問を抱く理由は、ポインタがノードのメモリアドレスを格納しているためです。また、シリアル化に続いて逆シリアル化すると、それらが同じメモリ位置にロードされるという保証はありません。また、シリアル化されたデータがネットワークを介して別のシステムに送信される場合も、同じ問題が発生します。
では、どのように機能しますか (もし機能する場合)?
Java にはポインタがありません。Java の変数は、データへの参照です。基本的に、これが意味することは、実際のデータを扱うのと同じように変数を扱うことであり、Java が「ポインター ロジック」を処理します (独自のポインター ロジックを処理する必要がある C とは異なります)。
クラスをシリアル化する場合、その参照に含まれるすべての情報(つまり、すべてのメンバー変数) をシリアル化する必要があります。これは、各参照を、参照される実際のデータのコピーに再帰的に展開するものと考えることができます。
ポインターを含む言語(たとえば、C) では、各ポインターが参照するデータではなく、ポインターを格納およびアンパックするシリアル化/逆シリアル化メソッドを実装すると、逆シリアル化されたデータに任意のポインターが含まれることになります。(つまり、シリアライゼーション/デシリアライゼーションは正しくありません。)
ポインタは参照です。シリアライズされたオブジェクトが参照に遭遇すると、それを再帰的にシリアライズします。そのため、すべてのメンバーもシリアライズ可能である必要があります。物理アドレスを保存するのではなく、独自のテーブルを作成するため、オブジェクトが既にアクセスされている場合はスキップできます。逆シリアル化すると、そのテーブルから新しいモデルが構築されます。
ポインターは、ポインターを持つプログラムを実行しているマシンのメモリ上の特定の場所への参照であり、ポインターはデータを持っている可能性があると言われています。
何かをシリアル化するときは、参照ではなくデータ自体をシリアル化する必要があります。相手側にデータがある場合、なぜそれを送信する必要があるのでしょうか。