为啥 ObjectOutputStream.writeObject 不采用 Serializable?
Posted
技术标签:
【中文标题】为啥 ObjectOutputStream.writeObject 不采用 Serializable?【英文标题】:Why does ObjectOutputStream.writeObject not take a Serializable?为什么 ObjectOutputStream.writeObject 不采用 Serializable? 【发布时间】:2013-12-01 08:14:01 【问题描述】:为什么ObjectOutputStream.writeObject(Object o)
不接受Serializable
?为什么要使用Object
?
【问题讨论】:
【参考方案1】:这是因为ObjectOutputStream
中的writeObject
覆盖了the ObjectOutput
interface 中的the method,这并不要求对象是Serializable
。
ObjectOutput
接口指定允许将对象写入流或底层存储的方法,但这可以通过序列化以外的过程来实现。 ObjectOutputStream
实现了这个功能,但需要可序列化的对象。但是,它不能修改它所实现的接口的签名。
【讨论】:
@Joachim 除了同步之外,还有什么过程允许将对象写入流? 请看我上面的评论。你能在这里放点灯吗? @Geek:真的。例如可以使用 JAXB。 为 ObjectOutputStream 编写一个writeSerializable
方法,而不是Object
,然后调用writeObject
方法不是更合适的实现吗? 【参考方案2】:
应该是ObjectOutputStream.writeObject(serializable)
而不是ObjectOutputStream. writeObject(Object)
。这是一个正确的用例,应该使用像 Serializable
这样的标记接口,但不幸的是没有。如果对象没有实现Serializable
接口,这将使编译时类型检查的真正好处成为可能,而不是在运行时失败。
我想借此机会提一下Joshua Bloch 在他的书中Effective java 中提到的内容:
标记接口是不包含方法的接口 声明,但仅指定(或“标记”)一个类 将接口实现为具有某些属性。例如, 考虑 Serializable 接口。通过实现这个接口,一个 类表示它的实例可以写入
ObjectOutputStream
(或“序列化”)。在
Serializable
标记接口的情况下,如果ObjectOutputStream.write(Object)
方法的参数没有 实现接口。莫名其妙的,作者ObjectOutputStream
API 没有利用Serializable
接口在声明 write 方法。方法的参数类型 应该是Serializable
而不是Object
。就目前而言,一个 尝试在不支持的对象上调用ObjectOutputStream.write
实现Serializable
只会在运行时失败,但它没有 就这样吧。
【讨论】:
以上是关于为啥 ObjectOutputStream.writeObject 不采用 Serializable?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 DataGridView 上的 DoubleBuffered 属性默认为 false,为啥它受到保护?