为什么ObjectOutputStream.writeObject不采用Serializable?

时间:2011-04-11 13:00:40

标签: java serialization marker-interfaces

为什么ObjectOutputStream.writeObject(Object o)没有Serializable?为什么要采用Object

2 个答案:

答案 0 :(得分:17)

这是因为writeObject中的ObjectOutputStream会覆盖the method中的the ObjectOutput interface,而不需要该对象为Serializable

ObjectOutput接口指定允许将对象写入流或底层存储的方法,但这可以通过序列化以外的进程来实现。 ObjectOutputStream实现了此功能,但需要可序列化的对象。但是,它无法修改它实现的接口的签名。

答案 1 :(得分:4)

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

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

  

标记接口是不包含任何方法的接口   声明,但只是指定(或“标记”)一个类   将接口实现为具有某些属性。例如,   考虑Serializable接口。通过实现这个接口,a   class表示可以将其实例写入   ObjectOutputStream(或“序列化”)。

     

对于Serializable标记接口,ObjectOutputStream.write(Object)方法如果其参数不存在则会失败   实现界面。令人费解的是,作者的   ObjectOutputStream API没有利用Serializable   接口声明write方法。方法的参数类型   应该是Serializable而不是Object。就目前而言,一个   尝试在没有的对象上调用ObjectOutputStream.write   实现Serializable只会在运行时失败,但它没有   就是这样。