Java中的非静态内部类和序列化有什么问题

时间:2009-07-31 16:45:23

标签: java performance serialization

今天早上,在尝试使用Web应用程序诊断性能问题时,我和我的老板对此进行了长时间的讨论。我们并没有真正得出任何结论。

我认为我们认为Serializable非静态内部类存在问题是正确的,但我们并不确切地知道问题是什么或者究竟要避免什么(我们推断我们不能总是< / em>简单地避免它)。任何人都可以建议任何没有遇到这个问题的指导方针吗?

4 个答案:

答案 0 :(得分:7)

内部类包含对其外部类的引用,因此尝试序列化内部也将序列化外部 - 以及外部可能包含的任何其他对象。这可能会产生巨大的对象图。如果外部具有无法序列化的状态(例如InputStream对象),则可能会失败。

也就是说,有时你必须使内部类Serializable,即使你从来没有计划序列化它们。例如,如果你正在使用Swing。

如果您计划序列化这些对象,我会质疑为什么他们需要成为内部类而不管性能如何。通常,您只是要序列化数据容器,而这些容器很少(如果有的话)需要引用某些“父”类。考虑使这些对象嵌套(静态)类而不是内部类。

答案 1 :(得分:3)

只是意识到序列化的内部类具有对其包含对象的隐式引用将会有很长的路要走。该引用确实有许多含义:

  • 自动生成引用,因此不能transient
  • 外部类必须是可序列化的
  • 外部类将使用内部类
  • 自动序列化
  • 外部对象无法与其内部对象取消关联

我可以挖掘的主要指南可能是“除了包含对象外,不要序列化内部类”。我想不出更多的陷阱。

答案 2 :(得分:0)

一个想法。如果您的外部类包含内部类的(非瞬态)实例集合,那么每次序列化其中一个内部类实例时,您实际上会将它们全部拉入序列化中。

答案 3 :(得分:0)

您可以创建Externalizable类并编写自己的自定义writeExternal和readExternal方法,这些方法只发送您想要的字段。

http://java.sun.com/javase/6/docs/api/java/io/Externalizable.html