javaはオブジェクトに対して何をシリアル化しますか?
静的フィールド?
非静的フィールド?
メソッドのプロトタイプ?
メソッド本体?
デフォルトでは、組み込みのもので?
非静的 (非一時的) フィールド、クラスへの参照 (メソッドのプロトタイプと本体を完全に決定する) だけです。
カスタムシリアライゼーションはあなたが望むことは何でもできますが、シリアライゼーションは単一のインスタンスオブジェクトを書くことになっているため、静的メソッドや変数は確実に除外されます...
メソッドはクラス定義自体からのものであるため、シリアル化されません。繰り返しになりますが、静的フィールドはインスタンス自体ではなくクラスに属しているため、シリアル化されません (シリアル化された値を反対側に適用できる場合、インスタンスが 1 つだけの場合、各インスタンス内で何かをシリアル化する意味は何でしょうか? )。したがって、答えは単なるフィールドです。
ただし、フィールドについても、ファイルが として修飾されている場合があり、transient
これらはシリアル化されません。例えば:
public class T implements Serializable {
transient int i = 0;
}
この場合、i
はシリアル化されず、逆シリアル化された各インスタンスはi
値 0 で表示されます。
静的フィールド?
番号
非静的フィールド?
そうではなくtransient
、クラスが実装する場合Serializable
メソッドのプロトタイプ?
番号
メソッド本体?
番号。
静的データやメソッドではなく、インスタンス データをシリアル化します。保存されたデータを微調整するには、transient
キーワード、Externalizable
インターフェイス、その他いくつかの方法を使用する方法がいくつかあります。
重大なことに、オブジェクトが他のオブジェクトを直接的または間接的に参照する場合、それらの他のすべてのオブジェクトもシリアル化されます。したがって、1 つのオブジェクトをシリアライズすると、何百万ものオブジェクトがシリアライズされる可能性があります。善悪を問わず、強力なツールです。
また、複数のオブジェクトを ObjectOutputStream に書き込み、1 つのオブジェクトが直接または間接的に既に書き込まれている場合、参照のみがストリームに送信されます。読み取られると、新しいオブジェクトには最初の書き込みからのデータが含まれます。これは、ファイルへの書き込み時には問題になりませんが、ソケットへの書き込み時には (大量のメモリ使用量とともに) 困惑する可能性があります。(とにかく、私を当惑させました。ヒント: reset()メソッドを使用してください。)