4

考虑以下代码:

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 抱怨editingCellandframingBlock字段说:

这个 Serializable 类定义了一个非原始实例字段,它既不是瞬态的、Serializable 也不是 java.lang.Object,并且似乎没有实现 Externalizable 接口或 readObject() 和 writeObject() 方法。如果此字段中存储了不可序列化的对象,则此类的对象将无法正确反序列化。

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

4

3 回答 3

5

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

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

于 2012-07-27T09:08:13.170 回答
0

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

于 2012-07-27T09:04:15.823 回答
-1

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

于 2015-03-13T11:00:21.630 回答