当通过覆盖 writeObject() 和 readObject() 可以进行自定义序列化时,java Externalization 有啥用? [复制]

Posted

技术标签:

【中文标题】当通过覆盖 writeObject() 和 readObject() 可以进行自定义序列化时,java Externalization 有啥用? [复制]【英文标题】:What is the use of the java Externalization when custom serialization is possible by overriding the writeObject() and readObject()? [duplicate]当通过覆盖 writeObject() 和 readObject() 可以进行自定义序列化时,java Externalization 有什么用? [复制] 【发布时间】:2019-11-19 18:07:47 【问题描述】:

我正在学习 java 序列化,我有一个疑问,如果可以通过覆盖类中的 writeObject() 和 readObject() 方法来自定义默认序列化过程,那么 Externalizable 接口有什么用?什么场景需要?

【问题讨论】:

从哪里覆盖?那些没有在 Object 类中定义。如果你想自定义一个对象的序列化,那么它应该实现Externalizable来自定义序列化,覆盖writeExternal(ObjectOutput out)readExternal(ObjectInput in)使其成为Serializable。除非任何对象可序列化,否则它不能通过网络发送或与任何流一起写入文件。如果您尝试这样做,它将抛出NotSerializableException @Nitin 这不正确。也可以提供自定义readObject()/writeObject()方法而不使用Externalizable这就是问题所在。 @OP Externalizable 一方面让你负责序列化超类的状态,另一方面没有默认行为。 user7294900 的回答在这种情况下有效。 有效但毫无用处。副本中的答案要好得多。 【参考方案1】:

用于自定义序列化,见Guide to the Externalizable

主要用途:

更改 JVM 的默认序列化行为。

用例:

如果我们需要序列化整个对象,Serializable 接口更适合。另一方面,对于自定义序列化,我们可以使用 Externalizable 来控制流程。

可能的性能优势:

java.io.Serializable 接口使用反射和元数据,导致性能相对较慢。相比之下,Externalizable 接口让您可以完全控制序列化过程。

【讨论】:

以上是关于当通过覆盖 writeObject() 和 readObject() 可以进行自定义序列化时,java Externalization 有啥用? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

java writeObject

Java.io.ObjectOutputStream.writeObject()方法实例

为啥 ObjectOutputStream.writeObject 不采用 Serializable?

使用 readObject/writeObject 反序列化

java Serializable接口没有功能,为啥会影响“writeObject”/“readObject”

使用 out.writeObject(object) 时出现序列化错误