为什么 ObjectOutputStream.writeObject 不采用 Serializable?

2022-09-01 23:36:47

为什么 ObjectOutputStream.writeObject(Object o) 不采用 Serializable?为什么它需要一个?Object


答案 1

这是因为 in 会覆盖 ObjectOutput 接口中的方法,该方法不要求对象为 。writeObjectObjectOutputStreamSerializable

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


答案 2

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

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

标记接口是不包含方法声明的接口,而只是指定(或“标记”)实现接口的类具有某些属性。例如,考虑可序列化接口。通过实现此接口,类指示其实例可以写入 (或“序列化”)。ObjectOutputStream

对于标记接口,如果方法的参数未实现该接口,则该方法将失败。莫名其妙的是,API的作者在声明写入方法时没有利用接口。该方法的参数类型应为 而不是 。就目前而言,尝试调用未实现的对象只会在运行时失败,但不必如此。SerializableObjectOutputStream.write(Object)ObjectOutputStreamSerializableSerializableObjectObjectOutputStream.writeSerializable