为什么ObjectOutputStream.writeObject不采用Serializable?
为什么ObjectOutputStream.writeObject(Object o)
不采用Serializable
? 为什么要使用Object
?
这是因为ObjectOutputStream
writeObject
会覆盖ObjectOutput
接口中 的方法 , 该方法不要求对象是Serializable
。
ObjectOutput
接口指定允许将对象写入流或底层存储的方法,但这可以通过序列化以外的进程来实现。 ObjectOutputStream
实现此function,但需要可序列化的对象。 但是,它无法修改它实现的接口的签名。
它应该是ObjectOutputStream.writeObject(serializable)
而不是ObjectOutputStream. writeObject(Object)
ObjectOutputStream. writeObject(Object)
。 这是一个正确的用例,其中应该使用像Serializable
这样的标记接口,但遗憾的是没有。 如果对象没有实现Serializable
接口,这将使编译时类型检查的真正好处成为可能,而不是在运行时失败。
我想借此机会提一下Joshua Bloch在他的书“ Effective java”中提到的内容:
标记接口是一个不包含方法声明的接口,但只是指定(或“标记”)一个实现接口具有某些属性的类。 例如,考虑Serializable接口。 通过实现此接口,类指示其实例可以写入
ObjectOutputStream
(或“序列化”)。对于
Serializable
标记接口,如果ObjectOutputStream.write(Object)
方法的参数未实现接口,则它将失败。 令人费解的是,ObjectOutputStream
API的作者在声明write方法时没有利用Serializable
接口。 方法的参数类型应该是Serializable
而不是Object
。 实际上,尝试在不实现Serializable
的对象上调用ObjectOutputStream.write
只会在运行时失败,但不一定是这样。