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

Java 可序列化类中的非瞬态非可序列化实例字段,java,serialization,findbugs,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; } 现在

考虑以下代码:

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
接口的类。类
CellCoord
FramingBlock
是带有一组getter和setter的pojo。FindBugs抱怨
editingCell
framingBlock
字段说:

这个可序列化类定义了一个非基本实例字段 既不是瞬态的、可序列化的,也不是java.lang.Object,也不是 似乎实现了外部化接口或readObject() 和writeObject()方法。此类的对象将不会 如果此文件中存储了不可序列化的对象,则正确反序列化 场


好的,所以一切都很好,除了它为什么说实例字段不是“java.lang.Object”之外。这完全是一种误导,或者我缺少一些基本知识?

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

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


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

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

我理解这一部分,但我的问题是为什么FindBUgs说这些文件不是对象?我想这只是FindBUgs中的一些东西。这两个类是
Object
s(显然),而
Object
没有实现
Serializable
。这对我来说也没有任何意义。我的建议是:将这两个类设置为可序列化的或暂时的,然后继续:D.@MikkoMaunu的可能重复项不完全是重复项,但感谢您指出这个答案。如果由于序列化类中使用的字节[]而出现上述问题,应该怎么做?