22

为什么不ObjectOutputStream.writeObject(Object o)带一个Serializable?为什么要一个Object

4

2 回答 2

17

这是因为writeObjectinObjectOutputStream覆盖了不需要对象为接口的方法ObjectOutputSerializable

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 的作者 在声明 write 方法ObjectOutputStream时没有利用接口。Serializable该方法的参数类型应该是Serializable而不是Object. 就目前而言,尝试调用ObjectOutputStream.write未实现的对象Serializable只会在运行时失败,但不必如此。

于 2013-11-19T08:53:20.440 回答