13

我们可以在 Java 中序列化静态内部类吗?类本身在这里被声明为静态的。

4

3 回答 3

23

在这方面,静态内部类与顶级类没有什么不同:如果它被声明为实现Serializable(或者是声明为实现的类的子类Serializable),它可以被序列化。此外,与顶级类一样,在运行时序列化期间遇到的所有对象都必须是可序列化的,以避免NotSerializableException. 由于内部类是static,因此外部类的性质与此无关。

于 2012-04-09T13:45:10.577 回答
2

@Tinkerbel 需要注意的一点 -

序列化静态嵌套类很好,但是当(将来)静态内部类被移动到不同的外部类时,反序列化旧对象是一个问题。

所有字段都被分配为默认/空。

于 2015-08-27T17:19:38.787 回答
-1

现在看来答案可能因 Java 版本而异。

JDK 7 中的序列化规范说:

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

根据在 Oracle 和 IBM JDK 1.7 版本之间序列化对象的经验,我可以告诉您它并不总是有效。我不能肯定它总是失败,但你肯定不能指望它工作。

在我的应用程序中没有失败的代码路径在 JDK 1.5 上运行了 5 年,在生产中运行良好,我在以前的序列化文档中没有看到与当前语句类似的任何内容。所以,Java 之神似乎在 JDK 7 中允许使用这种代码模式。

于 2013-07-24T22:20:07.920 回答