为啥 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,为啥它受到保护?

为啥需要softmax函数?为啥不简单归一化?

为啥 g++ 需要 libstdc++.a?为啥不是默认值?

为啥或为啥不在 C++ 中使用 memset? [关闭]

为啥临时变量需要更改数组元素以及为啥需要在最后取消设置?

为啥 CAP 定理中的 RDBMS 分区不能容忍,为啥它可用?