Java 静态内部类的序列化

Java 静态内部类的序列化,java,serialization,inner-classes,Java,Serialization,Inner Classes,我们可以在Java中序列化静态内部类吗?类本身在这里声明为静态。在这方面,静态内部类与顶级类没有什么不同:如果声明它实现可序列化(或者是声明实现可序列化)的类的子类,则它可以序列化。此外,与顶级类一样,在运行时序列化期间遇到的所有对象都必须可序列化,以避免出现notserializableeexception。由于内部类是静态的,外部类的性质与此无关。现在看来答案可能因Java版本而异 JDK 7中的序列化规范说明: 注意-由于几个原因,强烈建议不要序列化内部类(即非静态成员类的嵌套类),包括本

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

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

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

JDK 7中的序列化规范说明:

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

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


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

@Tinkerbel需要注意的是-

序列化静态嵌套类是可以的,但是(将来) 如果静态内部类被移动到不同的外部类,那么反序列化旧对象就是一个问题


所有字段都指定为默认值/空

那么,当你。。。试试看?当我这样做的时候,我的应用程序运行得很好。但是,为了实现这一点,我序列化了内部类和外部类,这对我来说是不必要的,但是我知道如果内部类被序列化,那么外部类必须被序列化。另外,我对静态类是否可以序列化有一些疑问。外部类与静态内部类的序列化无关。“静态内部类”在术语上是矛盾的。嵌套类要么是“静态”要么是“内部”。谢谢大家。我从你们那里得到了我所需要的。这与指定静态内部类的问题无关。如果有人能解释一下原因,那会很有帮助的?我观察到了这一点,但我没有一个非常令人信服的理由。。。听起来好像每当一个包被更改时,都应该发生这种情况