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



考虑以下代码:

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是带有一堆getter和setter的POJOS。FindBugs抱怨editingCellframingBlock字段说:

此Serializable类定义了一个非基元实例字段既不是瞬态的、可序列化的或java.lang.Object,也不是显示为实现Externalizable接口或readObject()和writeObject()方法。此类的对象将不会如果非序列化对象存储在领域

好吧,一切都很好,除了为什么说实例字段不是"java.lang.Object"。这完全是误导,或者我在这里缺少了一些基础知识?

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

在这种情况下,类的用户有责任确保存储在容器中的对象是可串行化的,如果他希望容器是可串行的。(就像ArrayList是可序列化的,当且仅当您在列表中存储可序列化对象时)。

您应该使CellCoord和FramingBlock可序列化以避免该错误。如果您不想序列化它们,那么应该将它们设置为瞬态的。

如果类中定义了任何一个对象,则类的对象将无法正确反序列化。扩展可序列化的对象将具有非基元实例字段,该字段既不是瞬态的,也不是可序列化的。因为如果类的任何对象想要保存其状态,它将不能仅仅因为一个既不是瞬态的非基元实例字段Serializable而这样做。

最新更新