今天早上,在尝试使用Web应用程序诊断性能问题时,我和我的老板对此进行了长时间的讨论。我们并没有真正得出任何结论。
我认为我们认为Serializable非静态内部类存在问题是正确的,但我们并不确切地知道问题是什么或者究竟要避免什么(我们推断我们不能总是< / em>简单地避免它)。任何人都可以建议任何没有遇到这个问题的指导方针吗?
答案 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