在Java中,我们可以序列化静态内部类吗?这里的类本身被声明为静态。
在Java中,我们可以序列化静态内部类吗?这里的类本身被声明为静态。
Serializable
(或是一个声明实现了Serializable
的类的子类),则它可以被序列化。同样,和顶层类一样,在运行时进行序列化时遇到的所有对象都必须是可序列化的,以避免出现NotSerializableException
异常。由于这个内部类是static
的,外围类的特性对此无关紧要。@Tinkerbel 需要注意的是 -
序列化静态嵌套类是没有问题的,但是如果在将来静态内部类被移到另一个外部类中,则反序列化旧对象会遇到问题。
所有字段都将被分配为默认/空值。
看起来答案可能因为Java版本的不同而有所不同。
JDK 7中的序列化规范表示:
注意 - 强烈不建议对内部类进行序列化(即非静态成员类的嵌套类),包括局部类和匿名类,原因有几个。由于在非静态上下文中声明的内部类包含对封闭类实例的隐式非瞬态引用,因此序列化这样的内部类实例将导致其关联的外部类实例也被序列化。javac(或其他JavaTM编译器)为实现内部类生成的合成字段是与实现相关的,可能在编译器之间有所不同;这些字段的差异可能会破坏兼容性,并导致冲突的默认serialVersionUID值。分配给局部类和匿名内部类的名称也是与实现相关的,可能在编译器之间有所不同。由于内部类不能声明除了编译时常量字段之外的静态成员,它们无法使用serialPersistentFields机制来指定可序列化的字段。最后,与外部实例关联的内部类没有零参数构造函数(此类内部类的构造函数隐式接受封闭实例作为前置参数),因此它们无法实现Externalizable。然而,上述列出的问题都不适用于静态成员类。
通过在Oracle和IBM JDK 1.7版本之间序列化对象的经验来看,我可以告诉你它并不总是有效。我不能确定它总是失败,但你肯定不能指望它能正常工作。
我的应用程序中不会出现故障的代码路径,在 JDK 1.5 上生产了 5 年,并且我在之前的序列化文档中也没有看到与当前语句相似的内容。所以,似乎 Java 神已经允许在 JDK 7 中使用此代码模式。