可序列化类中的非瞬态不可序列化实例字段

Gee*_*eek 4 java serialization findbugs

考虑以下代码:

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;   

}
Run Code Online (Sandbox Code Playgroud)

现在ClientEventSource扩展一个实现Serializableinterface 的类。类CellCoordFramingBlock是POJOS,其中包含大量的getter和setter。FindBugs抱怨editingCellframingBlock字段说:

这个Serializable类定义了一个非基本实例字段,该实例字段既不是临时的,Serializable的也不是java.lang.Object,并且似乎没有实现Externalizable接口或readObject()和writeObject()方法。如果不可序列化的对象存储在此字段中,则不会正确反序列化此类的对象。

好的,除了说实例字段不是“ java.lang.Object”以外,其他一切都很好。这完全是一种误导,还是我在这里缺少一些基础知识?

JB *_*zet 5

我的猜测(但这只是一个猜测)是,如果您引用java.lang.object实例,FindBugs不会触发此警告,因为它认为在这种情况下,您的类是通用容器,可以容纳任何类型的对象(例如Collection) 。

在这种情况下,类的用户有责任确保容器中存储的对象可序列化,如果他希望容器可序列化。(就像并且只有当您将可序列化对象存储在列表中时,ArrayArray才可序列化一样)。