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

时间:2017-12-20 18:02:40

标签: java serialization

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

2 个答案:

答案 0 :(得分:0)

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

  

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

但回答:

  

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

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

  

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

这是一个更详细的答案:

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

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

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 :(得分:-1)

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