java - Java中的可序列化和可外部化有什么区别?

标签 java serialization serializable externalizable

Serializable 和有什么区别?和 Externalizable在 Java 中?

最佳答案

要补充其他答案,通过实现 java.io.Serializable,您可以获得类对象的“自动”序列化功能。无需实现任何其他逻辑,它会正常工作。 Java 运行时将使用反射来确定如何编码和解码您的对象。

在早期版本的 Java 中,反射非常慢,因此序列化大型对象图(例如在客户端-服务器 RMI 应用程序中)有点性能问题。为了处理这种情况,提供了 java.io.Externalizable 接口(interface),它类似于 java.io.Serializable 但具有自定义编写的机制来执行编码和解码功能(你需要在你的类上实现 readExternalwriteExternal 方法)。这为您提供了绕过反射性能瓶颈的方法。

在 Java 的最新版本(当然是 1.3 及更高版本)中,反射的性能比以前要好得多,因此这不是什么问题。我怀疑你很难从现代 JVM 的 Externalizable 中获得有意义的好处。

此外,内置的 Java 序列化机制不是唯一的,您可以使用第三方替换,例如 JBoss Serialization,它的速度要快得多,并且是默认的直接替换。

Externalizable 的一大缺点是你必须自己维护这个逻辑 - 如果你在你的类中添加、删除或更改一个字段,你必须更改你的 writeExternal/readExternal 方法来解释它。

总之,Externalizable 是 Java 1.1 时代的遗物。真的不需要了。

关于java - Java中的可序列化和可外部化有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/817853/

相关文章:

Java 序列化为数组

java - FindBugs - SE_BAD_FIELD 规则,为什么它会忽略 java.lang.Object?

android - 如何将 ArrayList<CustomeObject> 从一个 Activity 传递到另一个 Activity ?

Java 对象 LinkedList 属性 : only receiving the first element on server-side using TCP

java - 解析 'multipart/alternative' 内容类型

java - Android:目标SIM卡/来电号码

go - 使用gob序列化到磁盘后检索

java - Logback %replace 它是否为每个日志语句编译正则表达式?

java - 'nest' ResultSet 查询是不可能的吗?或者在循环内使用查询?

java - 使用 Nimbus 外观时 writeObject() 期间出现 NullPointerException