当通过覆盖 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.io.ObjectOutputStream.writeObject()方法实例
为啥 ObjectOutputStream.writeObject 不采用 Serializable?
使用 readObject/writeObject 反序列化