我们可以序列化Java中的静态内部类吗?这个类本身在这里被声明为静态的。静态内部类的序列化
回答
在这方面,静态内部类与顶级类没有区别:如果它被声明为实现Serializable
(或者是声明实现Serializable
的类的子类),则它可以被序列化。此外,与顶级类一样,运行时序列化期间遇到的所有对象都必须可序列化以避免NotSerializableException
。由于内部类是static
,外部类的性质与此无关。
谢谢大家。我得到了你需要的东西。 – Tinkerbel 2012-04-09 13:50:50
现在看来答案可能会因Java版本而异。
在JDK 7的序列化规范说:
注 - 内部类(即嵌套类的非静态成员类),包括本地和匿名类的序列,是强烈反对的原因有几个。由于在非静态上下文中声明的内部类包含隐含的非瞬时引用来包含类实例,所以序列化这样的内部类实例也会导致其关联的外部类实例序列化。由javac(或其他JavaTM编译器)生成的用于实现内部类的合成域依赖于实现,可能因编译器而异;这些字段中的差异可能会破坏兼容性,并导致默认的serialVersionUID值发生冲突。分配给本地和匿名内部类的名称也与实现有关,编译器之间可能会有所不同。由于内部类不能声明编译时常量字段以外的静态成员,因此它们不能使用serialPersistentFields机制来指定可序列化的字段。最后,由于与外部实例关联的内部类没有零参数构造函数(这种内部类的构造函数隐式地接受封闭实例作为前置参数),因此它们无法实现Externalizable。但是,上面列出的问题都不适用于静态成员类。
以及在Oracle和IBM JDK 1.7版本之间对序列化对象的经验,我可以告诉你它并不总是有效。我不能肯定地说它总是失败,但你肯定不能指望它工作。
在我的应用程序中没有失败的代码路径在生产环境中在JDK 1.5上运行良好,并且在以前的文档中没有看到类似当前语句的序列化文档。因此,它似乎在Java神已经被允许在JDK这个代码模式7.
这与指定** static **内部类的问题无关。 – gerardw 2014-11-26 15:41:34
@Tinkerbel东西要注意 -
序列化静态内部类是不错,但如果(在未来) 如果静态内部类是永远移动到不同的外部类,然后序列化旧对象是一个问题。
所有的字段被分配为默认值/ null。
如果有人能解释为什么会有帮助吗?我观察到,但我没有一个非常有说服力的理由......听起来像是每当一个软件包发生变化时,都应该发生 – user2674407 2015-08-27 17:21:47
- 1. 序列化静态类
- 2. 内部类的静态初始化器?
- 3. 静态内部类
- 4. 初始化静态内部类
- 5. 如何序列化非静态子类的静态类
- 6. 序列化和反序列化类中的静态成员?
- 7. 我如何序列化静态类?
- 8. 静态内部类 - 怪异
- 9. 静态内部类中阶
- 10. 静态类变量和序列化/反序列化
- 11. 使用非静态方法中的内部类的静态类
- 12. 静态初始化的Java序列化
- 13. 内部类到xml的序列化
- 14. 可序列化的内部类
- 15. 为什么可序列化的内部类不可序列化?
- 16. 嵌套类VS静态内部类
- 17. 使用内部类进行子类化,仅序列化外部
- 18. 覆盖静态内部类的静态方法的Stackoverflow错误
- 19. Java中的内部静态类
- 20. 访问从静态内部类Form1的
- 21. Android的 - 使静态内部类活动
- 22. python中的静态内部类
- 23. java如何让内部静态类的实例化?
- 24. 初始化模板内部类的静态成员
- 25. 静态和非静态内部类的区别?
- 26. 是默认静态内部类的成员静态在java中
- 27. 静态内部类和非静态的外方法
- 28. JsonSerializer - 类如序列化静态类瓦尔的
- 29. JYAML:序列化/反序列化嵌套/内部类
- 30. 序列化内部类实例
那么,当你......尝试时会发生什么? – 2012-04-09 13:43:00
当我这样做时,我的应用程序正常工作。但是,为了做到这一点,我正在序列化内部类和外部类,这对我来说不是必需的,但是我知道如果内部类被序列化,则外部必须被序列化。而且,我对静态类中的一些疑惑可以被序列化或不可以。 – Tinkerbel 2012-04-09 13:46:03
外部类与_static_内部类的序列化无关。 – 2012-04-09 13:48:47