ObjectOutputStream.writeObject(Object o)
をとらないのはなぜSerializable
ですか?なぜそれがかかるのObject
ですか?
2 に答える
これはwriteObject
、ObjectOutputStream
オブジェクトが. _ _ ObjectOutput
_Serializable
インターフェイスはObjectOutput
、オブジェクトをストリームまたは基になるストレージに書き込むことを可能にするメソッドを指定しますが、これはシリアライゼーション以外のプロセスによって達成される場合があります。はこのObjectOutputStream
機能を実装しますが、シリアライズ可能なオブジェクトが必要です。ただし、実装するインターフェイスの署名を変更することはできません。
ではObjectOutputStream.writeObject(serializable)
なくObjectOutputStream. writeObject(Object)
、のようなマーカー インターフェースSerializable
が使用されるべきでしたが、残念ながら使用されなかった適切な使用例です。これにより、オブジェクトがインターフェイスを実装していない場合に実行時に失敗するのではなく、コンパイル時の型チェックの真の利点が可能になりSerializable
ます。
この機会に、 Joshua Blochが彼の著書「 Effective Java 」で言及したことについて言及したいと思います。
マーカー インターフェイスは、メソッド宣言を含まないインターフェイスですが、そのインターフェイスを実装するクラスを何らかのプロパティを持つものとして指定 (または「マーク」) するだけです。たとえば、Serializable インターフェイスについて考えてみましょう。このインターフェイスを実装することにより、クラスはそのインスタンスを に書き込む
ObjectOutputStream
(または「シリアル化」する) ことができることを示します。
Serializable
マーカー インターフェイスの場合ObjectOutputStream.write(Object)
、その引数がインターフェイスを実装していない場合、メソッドは失敗します。不可解なことに、API の作成者 は書き込みメソッドを宣言する際にインターフェイスObjectOutputStream
を利用しませんでした。Serializable
メソッドの引数の型は、Serializable
ではなくObject
.ObjectOutputStream.write
現状では、実装されていないオブジェクトを呼び出そうとするとSerializable
、実行時にのみ失敗しますが、そうである必要はありませんでした。