簡體   English   中英

Java中的非靜態內部類和序列化有什么問題

[英]What are the issues with non-static inner classes and serialization in Java

今天早上,在嘗試使用Web應用程序診斷性能問題時,我和我的老板對此進行了長時間的討論。 我們並沒有真正得出任何結論。

我認為我們認為Serializable非靜態內部類有問題是正確的,但我們不確定究竟是什么問題或者究竟要避免什么(我們推斷我們不能總是簡單地避免它)。 任何人都可以建議任何沒有遇到這個問題的指導方針嗎?

內部類包含對其外部類的引用,因此嘗試序列化內部也將序列化外部 - 以及外部可能包含的任何其他對象。 這可能會產生巨大的對象圖。 如果外部具有無法序列化的狀態(例如InputStream對象),則可能會失敗。

也就是說,有時你必須使內部類Serializable,即使你從來沒有計划序列化它們。 例如,如果您正在使用Swing。

如果你計划序列化這些對象,我會問為什么他們需要成為內部類而不管性能如何。 通常,您只是要序列化數據容器,而這些容器很少(如果有的話)需要引用某些“父”類。 考慮使這些對象嵌套(靜態)類而不是內部類。

只是意識到序列化的內部類具有對其包含對象的隱式引用將會有很長的路要走。 該引用確實有許多含義:

  • 引用是自動生成的,因此不能是transient
  • 外部類必須是可序列化的
  • 外部類將使用內部類自動序列化
  • 外部對象不能與其內部對象分離

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

一個想法。 如果您的外部類包含內部類的(非瞬態)實例集合,那么每次序列化其中一個內部類實例時,您實際上會將它們全部拉入序列化中。

您可以創建Externalizable類並編寫自己的自定義writeExternal和readExternal方法,這些方法只發送您想要的字段。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM