考虑以下代码:
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的POJOS。FindBugs抱怨editingCell
和framingBlock
字段说:
此Serializable类定义了一个非基元实例字段既不是瞬态的、可序列化的或java.lang.Object,也不是显示为实现Externalizable接口或readObject()和writeObject()方法。此类的对象将不会如果非序列化对象存储在领域
好吧,一切都很好,除了为什么说实例字段不是"java.lang.Object"。这完全是误导,或者我在这里缺少了一些基础知识?
我的猜测(但这只是猜测)是,如果您引用java.lang.object
实例,FindBugs不会触发此警告,因为它认为在这种情况下,您的类是一个通用容器,可以容纳任何类型的对象(如Collection)。
在这种情况下,类的用户有责任确保存储在容器中的对象是可串行化的,如果他希望容器是可串行的。(就像ArrayList是可序列化的,当且仅当您在列表中存储可序列化对象时)。
您应该使CellCoord和FramingBlock可序列化以避免该错误。如果您不想序列化它们,那么应该将它们设置为瞬态的。
如果类中定义了任何一个对象,则类的对象将无法正确反序列化。扩展可序列化的对象将具有非基元实例字段,该字段既不是瞬态的,也不是可序列化的。因为如果类的任何对象想要保存其状态,它将不能仅仅因为一个既不是瞬态的非基元实例字段Serializable而这样做。