の使い方を学んでいますSerializable
。
実装するさまざまな変数を持つクラス「A」を作成し、クラスSerializable
に追加Serializable
すると、それもSerializable
.
しかし、これら 2 つの方法をシリアライズするために実際に実装しているのは誰でしょうか? 必要に応じて、すべてを処理しますかObject
、それとも別のクラスでそれらをオーバーロードしますか?
の使い方を学んでいますSerializable
。
実装するさまざまな変数を持つクラス「A」を作成し、クラスSerializable
に追加Serializable
すると、それもSerializable
.
しかし、これら 2 つの方法をシリアライズするために実際に実装しているのは誰でしょうか? 必要に応じて、すべてを処理しますかObject
、それとも別のクラスでそれらをオーバーロードしますか?
java.io.ObjectOutputStream
シリアライゼーションは、 (および java.io.ObjectInputStream) とそのヘルパー クラスの一部に実際に実装されています。多くの場合、この組み込みサポートで十分であり、開発者はマーカー インターフェースを実装するだけで済みますSerializable
。このインターフェイスは、メソッドを宣言せず、実装クラスに特別な API を必要としないため、「マーカー」と呼ばれます。
プログラマーは、必要に応じて、デフォルトのシリアル化メカニズムを独自のメソッドに追加または置換できます。たとえば、オブジェクトを逆シリアル化した後に追加の初期化が必要な場合は、次のシグネチャを使用してメソッドを追加できます。
private void readObject(java.io.ObjectInputStream s)
throws java.io.IOException, java.lang.ClassNotFoundException
シリアライゼーションとデシリアライゼーションを完全に制御するには、java.io.Externalizable
代わりに を実装しSerializable
ます。
必要に応じて、Java シリアライゼーションには他にも多くの拡張ポイントがあります。シリアライゼーション仕様は、それらすべてについて学習するための信頼できる完全な情報源です。
あなたが話している方法はreadObject()
とwriteObject()
. オブジェクトにシリアル化できないフィールドがある場合など、カスタムのシリアル化を行う必要がある場合にのみ、これらを実装する必要があります。シリアル化可能なフィールドとプリミティブしかない場合は、カスタムのシリアル化メソッドを実装する必要はありません。また、transient
キーワードを追加することで、シリアル化の一部のフィールドをスキップできます。
のAPIドキュメントを見るSerializable
と、仕組みが詳しく説明されています。
基本的に、オブジェクトのシリアル化方法をさらに制御したい場合を除き、何もする必要はありません。その場合、実装できる「魔法の」メソッドがいくつかあり、シリアル化メカニズムによって呼び出されます。
完全に制御したい場合は、代わりにExternalizableを使用できます。
Serializable を実装するさまざまな変数を持つクラス「A」を作成し、Serializable を自分のクラスに追加すると、それも Serializable になります。
はい、この時点であなたのクラスはシリアライズ可能です。
クラスをシリアライズ可能にするには、そのクラスのメンバーとして含まれる各オブジェクトもシリアライズ可能である必要があります。Java は、あなたのオブジェクトが参照するすべてのオブジェクトのツリーをたどり、それぞれを順番にシリアライズします。
オブジェクトのシリアライズ方法をより詳細に制御したい場合は、Externalizable インターフェイスを実装できます。
Externalizable インターフェイスの writeExternal および readExternal メソッドは、クラスによって実装され、オブジェクトとそのスーパータイプのストリームの形式と内容を完全に制御できるようにします。
直列化可能でなければならないクラスを実装する場合、同じクラスで直列化を行うメソッドも提供する必要があります。
クラスが正常にシリアライズおよびデシリアライズされるために必要なものを Object に頼って推測することはできません。たとえば、シリアル化する必要のないクラスの作業変数を考えてみてください。オブジェクトはそれらを重要なフィールドと区別できません。