有效的java项目编号74(关于序列化):明智地实现Serializable

Try*_*ing 5 java effective-java

有效的java书的第74号项目有一个段落(项目74的最后一个第2段),如下所述:

内部类(第22项)不应实现Serializable.它们使用编译器生成的合成字段来存储对封闭实例的引用,并存储来自封闭范围的局部变量的值.这些字段如何对应于类定义是未指定的,匿名和本地类的名​​称也是如此. 因此,内部类的默认序列化形式是不明确的.

我知道内部类使用编译器生成的合成字段来存储对封闭实例的引用,例如,如果封闭类是MyEnclosing而内部类是MyInner,则封闭引用是MyEnclosing.this.但我无法获得BOLD部分.请帮我理解意思.谢谢!!!

Rus*_*ser 6

假设你有一个像这样的本地类:

 class OuterClass {
    Runnable run;

    void method() {
       final int a = 8;
       this.run = new Runnable() {
          public void run() {
             System.out.println(a);
          }
       };
    }
 }
Run Code Online (Sandbox Code Playgroud)

现在假设我尝试序列化this,其中包含此内部类类型的对象.我的编译器为该类命名OuterClass$1并给它一个名为的字段val$a.但是在这种情况下使用的确切名称不是编译器规范的一部分.另一个编译器可能会选择调用内部类OuterClass$method$1.在这种情况下,即使使用相同的源文件,在一个编译版本中序列化和在另一个编译版本中反序列化也会失败.

(另外,还有一个问题是匿名内部类没有no-args构造函数.但是由于上面的问题,即使命名的内部类也无法可靠地序列化)