22

ObjectOutputStream.writeObject(Object o)をとらないのはなぜSerializableですか?なぜそれがかかるのObjectですか?

4

2 に答える 2

17

これはwriteObjectObjectOutputStreamオブジェクトが. _ _ ObjectOutput_Serializable

インターフェイスはObjectOutput、オブジェクトをストリームまたは基になるストレージに書き込むことを可能にするメソッドを指定しますが、これはシリアライゼーション以外のプロセスによって達成される場合があります。はこのObjectOutputStream機能を実装しますが、シリアライズ可能なオブジェクトが必要です。ただし、実装するインターフェイスの署名を変更することはできません。

于 2011-04-11T13:06:30.483 に答える
4

では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、実行時にのみ失敗しますが、そうである必要はありませんでした。

于 2013-11-19T08:53:20.440 に答える