16

の使い方を学んでいますSerializable

実装するさまざまな変数を持つクラス「A」を作成し、クラスSerializableに追加Serializableすると、それもSerializable.

しかし、これら 2 つの方法をシリアライズするために実際に実装しているのは誰でしょうか? 必要に応じて、すべてを処理しますかObject、それとも別のクラスでそれらをオーバーロードしますか?

4

6 に答える 6

15

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 シリアライゼーションには他にも多くの拡張ポイントがあります。シリアライゼーション仕様は、それらすべてについて学習するための信頼できる完全な情報源です。

于 2009-06-09T15:57:46.150 に答える
7

あなたが話している方法はreadObject()writeObject(). オブジェクトにシリアル化できないフィールドがある場合など、カスタムのシリアル化を行う必要がある場合にのみ、これらを実装する必要があります。シリアル化可能なフィールドとプリミティブしかない場合は、カスタムのシリアル化メソッドを実装する必要はありません。また、transientキーワードを追加することで、シリアル化の一部のフィールドをスキップできます。

于 2009-06-09T15:54:45.367 に答える
3

のAPIドキュメントを見るSerializableと、仕組みが詳しく説明されています。

基本的に、オブジェクトのシリアル化方法をさらに制御したい場合を除き、何もする必要はありません。その場合、実装できる「魔法の」メソッドがいくつかあり、シリアル化メカニズムによって呼び出されます。

完全に制御したい場合は、代わりにExternalizableを使用できます。

于 2009-06-09T16:06:48.757 に答える
1

Serializable を実装するさまざまな変数を持つクラス「A」を作成し、Serializable を自分のクラスに追加すると、それも Serializable になります。

はい、この時点であなたのクラスはシリアライズ可能です。

于 2009-06-09T15:58:16.803 に答える
1

クラスをシリアライズ可能にするには、そのクラスのメンバーとして含まれる各オブジェクトもシリアライズ可能である必要があります。Java は、あなたのオブジェクトが参照するすべてのオブジェクトのツリーをたどり、それぞれを順番にシリアライズします。

オブジェクトのシリアライズ方法をより詳細に制御したい場合は、Externalizable インターフェイスを実装できます。

Externalizable インターフェイスの writeExternal および readExternal メソッドは、クラスによって実装され、オブジェクトとそのスーパータイプのストリームの形式と内容を完全に制御できるようにします。

于 2009-06-09T16:07:57.743 に答える
-1

直列化可能でなければならないクラスを実装する場合、同じクラスで直列化を行うメソッドも提供する必要があります。

クラスが正常にシリアライズおよびデシリアライズされるために必要なものを Object に頼って推測することはできません。たとえば、シリアル化する必要のないクラスの作業変数を考えてみてください。オブジェクトはそれらを重要なフィールドと区別できません。

于 2009-06-09T15:52:46.507 に答える