簡體   English   中英

可序列化類中的非瞬態不可序列化實例字段

[英]Non-transient non-serializable instance field in serializable class

考慮以下代碼:

public class LIMSGrid extends ClientEventSource implements Focusable, FramingBlockWrapper {

  //cell that is curently in edit mode
  private CellCoord editingCell = null;

  //framing block info
  private FramingBlock framingBlock;   

}

現在, ClientEventSource擴展了一個實現Serializable接口的類。 CellCoordFramingBlock類是POJOS,具有大量的getter和setter方法。 FindBugs在抱怨editingCellframingBlock字段說:

該Serializable類定義了一個非基本實例字段,該實例字段既不是臨時的,Serializable的也不是java.lang.Object,並且似乎沒有實現Externalizable接口或readObject()和writeObject()方法。 如果不可序列化的對象存儲在此字段中,則不會正確反序列化此類的對象。

好的,所以一切都很好,只是說實例字段不是“ java.lang.Object”。 這完全是誤導,還是我在這里缺少一些基礎知識?

我的猜測(但這只是一個猜測)是,如果您引用java.lang.object實例,FindBugs不會觸發此警告,因為它認為在這種情況下,您的類是通用容器,可以容納任何類型的對象(如收藏)。

在這種情況下,類的用戶有責任確保容器中存儲的對象可序列化,如果他希望容器可序列化。 (就像並且只有當您將可序列化的對象存儲在列表中時,ArrayList才能可序列化一樣)。

您應該使CellCoord和FramingBlock可序列化以避免該錯誤。 如果您不想序列化它們,則應將它們設置為瞬態。

如果在類中定義了擴展可序列化對象的對象中的任何一個,則該類的對象將無法正確反序列化。這些對象具有非基本實例字段,該實例字段既不是瞬態的,也不是可序列化的。 因為如果類的任何對象都想保存其狀態,就不能僅僅因為一個非主實例字段而不能保存該對象,該實例字段既不是臨時的,也不是可序列化的。

暫無
暫無

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

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