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

时间:2012-07-27 08:58:46

标签: 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;   

}

现在ClientEventSource扩展了一个实现Serializable接口的类。类CellCoordFramingBlock是POJOS,包含一堆getter和setter。 FindBugs抱怨editingCellframingBlock字段说:

  

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

好的,所以一切都很好,除非它说实例字段不是“java.lang.Object”。这完全是误导,或者我在这里缺少一些基础知识?

3 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:-1)

如果类中定义的任何一个对象在扩展serializable时将具有非原始实例字段(既不是瞬态的,可序列化的),则不会正确地反序列化类的对象。因为如果类的任何对象想要保存它的状态,那么它将无法仅仅因为一个非原始的实例字段而不是瞬态的,可序列化的。