2012-04-09 46 views
12

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

+12

那么,当你......尝试时会发生什么? – 2012-04-09 13:43:00

+1

当我这样做时,我的应用程序正常工作。但是,为了做到这一点,我正在序列化内部类和外部类,这对我来说不是必需的,但是我知道如果内部类被序列化,则外部必须被序列化。而且,我对静态类中的一些疑惑可以被序列化或不可以。 – Tinkerbel 2012-04-09 13:46:03

+0

外部类与_static_内部类的序列化无关。 – 2012-04-09 13:48:47

回答

18

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

+1

谢谢大家。我得到了你需要的东西。 – Tinkerbel 2012-04-09 13:50:50

0

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

在JDK 7的序列化规范说:

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

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

在我的应用程序中没有失败的代码路径在生产环境中在JDK 1.5上运行良好,并且在以前的文档中没有看到类似当前语句的序列化文档。因此,它似乎在Java神已经被允许在JDK这个代码模式7.

+3

这与指定** static **内部类的问题无关。 – gerardw 2014-11-26 15:41:34

1

@Tinkerbel东西要注意 -

序列化静态内部类是不错,但如果(在未来) 如果静态内部类是永远移动到不同的外部类,然后序列化旧对象是一个问题。

所有的字段被分配为默认值/ null。

+0

如果有人能解释为什么会有帮助吗?我观察到,但我没有一个非常有说服力的理由......听起来像是每当一个软件包发生变化时,都应该发生 – user2674407 2015-08-27 17:21:47