And*_*dyT 17

这是因为,writeObjectObjectOutputStream覆盖该方法ObjectOutput接口,它不需要该对象是Serializable.

ObjectOutput接口指定了允许对象被写入到一个流或底层存储方法,但是这可通过比序列以外的处理来实现.在ObjectOutputStream实现了这个功能,但需要序列化的对象.但是,它无法修改它实现的接口的签名.


Try*_*ing 5

应该是ObjectOutputStream.writeObject(serializable)而不是ObjectOutputStream. writeObject(Object)Serializable这是一个正确的用例,应该使用类似的标记接口,但不幸的是没有。如果对象没有实现接口,这将使编译时类型检查的真正好处成为可能,而不是在运行时失败Serializable

\n\n

我想借此机会提一下Joshua Bloch在他的 《Effective java》一书中提到的内容:

\n\n
\n

标记接口是不包含方法声明的接口,而仅指定(或 xe2x80x9cmarksxe2x80x9d)实现具有某些属性的接口的类。例如,考虑可序列化接口。通过实现此接口,a\n 类指示其实例可以写入\n ObjectOutputStream(或\xe2\x80\x9cserialized\xe2\x80\x9d)。

\n\n

对于Serializable标记接口,ObjectOutputStream.write(Object)如果其参数未实现该接口,则该方法将失败。令人费解的是,\n API 的作者 在声明 write 方法时ObjectOutputStream没有利用\n 接口。Serializable方法\xe2\x80\x99s 参数类型\n 应该是Serializable而不是Object。就目前情况而言,尝试调用ObjectOutputStream.write未实现的对象Serializable只会在运行时失败,但事实并非如此。

\n
\n