Java内部类序列化问题

midoll 478 2022-09-22

Java内部类序列化问题

一个类能够序列化,需要满足两个条件:

 1. 类本身实现序列化接口Serializable
 2. 类所有的成员属性实现序列化接口Serializable

Java的嵌套类(nested class)一共有四种:

  • static nested class 静态内部类
  • inner class 内部类(非静态)
  • local class 本地类(定义在方法内部)
  • anonymous class 匿名类

静态嵌套类的行为更接近普通的类,另外三个是真正的内部类。区别在于作用域的不同。

以下是对他们的性质描述:

image-1663814388463

1、首先我们对静态嵌套类(static nested class)进行序列化。同理,也要实现序列化接口Serializable。

image-1663814433790

成功了,跟预料中一样。

2、然后我们对内部类(inner class)进行序列化。同理,也要实现序列化接口Serializable。

image-1663814462679

异常了,提示我们外部类没有序列化。那我们就将外部类也实现序列化接口。
image-1663814484174

成功了,这是为什么呢?

网上查了一些资料,总结如下:

所有的内部类,Local内部类,匿名内部类都可以直接访问外面的封装类的实例变量和方法。而静态嵌套类则不能。

为了实现这一行为,内部类,Local内部类,匿名内部类的实例都持有一个外部封装类实例的隐式引用,而Java对象序列化要求对象里所有的对象成员都必须实现序列化接口。

所以,嵌套类要想能够序列化,除了本身和所有成员属性都要实现序列化接口以外,要么声明为静态嵌套类,要么让外部类也实现序列化接口。