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