0

是否可以序列化非静态内部类?

如果是,你能提供一个很好的例子。

我通过一些博客和网站搜索,没有答案说服了我。

编辑: 内部类有最终静态变量怎么样。

4

1 回答 1

8

内部类包含对外部类的隐式引用,因此要使内部类可序列化,其外部类也必须是可序列化的。

完全来自文档:

出于几个原因,强烈建议不要对内部类(即不是静态成员类的嵌套类)(包括本地和匿名类)进行序列化。因为在非静态上下文中声明的内部类包含对封闭类实例的隐式非瞬态引用,所以序列化这样的内部类实例也会导致其关联的外部类实例的序列化。由 javac(或其他 JavaTM 编译器)生成的用于实现内部类的合成字段是依赖于实现的,并且可能因编译器而异;此类字段的差异可能会破坏兼容性并导致默认 serialVersionUID 值冲突。分配给本地和匿名内部类的名称也取决于实现,并且可能因编译器而异。由于内部类不能声明编译时常量字段以外的静态成员,因此它们不能使用 serialPersistentFields 机制来指定可序列化字段。最后,因为与外部实例关联的内部类没有零参数构造函数(此类内部类的构造函数隐式接受封闭实例作为前置参数),它们无法实现 Externalizable。然而,上面列出的所有问题都不适用于静态成员类。因为与外部实例关联的内部类没有零参数构造函数(此类内部类的构造函数隐式接受封闭实例作为前置参数),它们无法实现 Externalizable。然而,上面列出的所有问题都不适用于静态成员类。因为与外部实例关联的内部类没有零参数构造函数(此类内部类的构造函数隐式接受封闭实例作为前置参数),它们无法实现 Externalizable。然而,上面列出的所有问题都不适用于静态成员类。

所以

因为在非静态上下文中声明的内部类包含对封闭类实例的隐式非瞬态引用,所以序列化这样的内部类实例也会导致其关联的外部类实例的序列化。

资源

于 2012-05-29T10:59:50.080 回答