# Java 中`Externalizable`与`Serializable`之间的区别

> 原文： [https://howtodoinjava.com/java/serialization/externalizable-vs-serializable/](https://howtodoinjava.com/java/serialization/externalizable-vs-serializable/)

知道`Externalizable`与`Serializable`之间的差异在两个方面都很重要，一个是可以作为面试问题询问，另外一个是您可以利用该知识做出更明智的决策，将序列化应用到您的应用中来追求性能提升。

## 1\. `Externalizable`与`Serializable`之间的区别

让我们列出 Java 中[`Externalizable`](https://docs.oracle.com/javase/8/docs/api/java/io/Externalizable.html)和[`Serializable`](https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html)接口之间的主要区别。

| `Externalizable` | `Serializable` |
| --- | --- |
| `Serializable`是标记接口，即不包含任何方法。 | `Externalizable`接口包含实现类必须覆盖的两个方法`writeExternal()`和`readExternal()`。 |
| `Serializable`接口将序列化的职责传递给 JVM 及其默认算法。 | `Externalizable`向程序员提供串行化逻辑的控制-编​​写自定义逻辑。 |
| 通常，默认序列化易于实现，但具有较高的性能成本。 | 使用`Externalizable`完成的序列化为程序员增加了更多责任，但通常会带来更好的性能。 |
| 很难分析和修改类结构，因为任何更改都可能会破坏序列化。 | 由于可以完全控制序列化逻辑，因此分析和修改类结构更加容易。 |
| 默认序列化不调用任何类构造器。 | 使用`Externalizable`接口时，需要一个公共的无参数构造器。 |

请注意，`Externalizable`接口是`Serializable`的子接口，即`Externalizable extends Serializable`。 因此，如果任何类实现`Externalizable`接口并覆盖其`writeExternal()`和`readExternal()`方法，则这些方法优先于 JVM 提供的默认序列化机制。

> 阅读更多：[如何在 Java 中覆盖默认的序列化机制](https://howtodoinjava.com/java/serialization/custom-serialization-readobject-writeobject/)

## 2\. 阅读有关`Externalizable`与`Serializable`的更多信息

*   [使用 Java 中的`Externalizable`特性的更高效的序列化](//howtodoinjava.com/java/serialization/java-externalizable-example/)
*   [Java `Serializable`接口实现指南](//howtodoinjava.com/java/serialization/a-mini-guide-for-implementing-serializable-interface-in-java/)
*   [Java 中反序列化过程如何发生？](//howtodoinjava.com/java/serialization/how-deserialization-process-happen-in-java/)

请在与 **Java** 中的`Externalizable`与`Serializable`接口有关的评论部分中提出您的问题。

学习愉快！