是否有一些由Java自动序列化的对象或数据类型(无需实现Serializable)?

问题描述 投票:1回答:2

我学会了在学校实现Serializable,但是从来没有提到过什么,如果有的话,对象已经在Java中实现了这一点。所以我的问题是标题“是否有一些由Java自动序列化的对象或数据类型(无需实现Serializable)?”如果是这样,它们背后的原因是什么呢?

java serialization
2个回答
0
投票

Javadoc很清楚(重点是我的):

实现java.io.Serializable接口的类启用了类的可序列化。未实现此接口的类将不会将其任何状态序列化或反序列化。

但要回答:

“是否有一些由Java自动序列化的对象或数据类型(无需实现Serializable)?”

答案是肯定的,因为Javadoc补充说:

可序列化类的所有子类型本身都是可序列化的。

这是一个更详细的答案:

1)原语事实上是可序列化的。

2)非常重要的JDK类实现Serializable。这是有道理的,因为这些不能被客户修改,因此不能被序列化。 Here是javadoc中生成的“java.io.Serializable接口的使用”。名单很大。

3)每个数组类型实现接口Cloneable和java.io.Serializable,其原因与其他JDK类完全相同。(JLS 10.1 Array Types)

4)可序列化类的所有子类型本身都是可序列化的。

例如,javax.swing.JComponent是除顶级容器之外的所有Swing组件的基类,它实现了Serializable

public abstract class JComponent extends Container implements Serializable,...{...}

因此,它的子类不需要直接实现Serializable,实际上他们中的大多数都没有这样做。 例如 :

public abstract class AbstractButton extends JComponent implements ItemSelectable, SwingConstants {...}

public class JButton extends AbstractButton implements Accessible {...}

public class JComboBox<E> extends JComponent{...}

我们可以看到类似于Number的东西,它是数值的基类。 Number实施Serializable

public abstract class Number implements java.io.Serializable {...}

许多子类通过传递性实现Serializable

public final class Integer extends Number implements Comparable<Integer> {...}
public final class Float extends Number implements Comparable<Float> {...}

但请注意,实现Serializable的类的子类也可以显式实现java.io.Serializable,例如:

public class AtomicInteger extends Number implements java.io.Serializable {...}

可能是为了使源代码中的信息更加明确。 但是在代码不稳定且层次结构可能发生变化的情况下,它也会有所帮助。 无论发生什么变化,该课程都可以进行序列化。


-1
投票

是。所有数组类型都可自动序列化。 JLS #10.1

© www.soinside.com 2019 - 2024. All rights reserved.