请考虑以下代码:
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
是POJOS,包含一堆getter和setter。 FindBugs抱怨editingCell
和framingBlock
字段说:
此Serializable类定义了一个非原始实例字段 既不是瞬态的,可序列化的,也不是java.lang.Object,而不是 似乎实现了Externalizable接口或readObject() 和writeObject()方法。这个类的对象不会 如果非Serializable对象存储在此中,则正确反序列化 字段。
好的,所以一切都很好,除非它说实例字段不是“java.lang.Object”。这完全是误导,或者我在这里缺少一些基础知识?
答案 0 :(得分:4)
我的猜测(但这只是一个猜测)是,如果引用java.lang.object
实例,FindBugs不会触发此警告,因为它认为在这种情况下,您的类是一个通用容器,可以容纳任何对象的类型(如集合)。
在这种情况下,类的用户有责任确保容器中存储的对象是可序列化的,如果他希望容器可序列化的话。 (就像ArrayList是可序列化的,当且仅当你在列表中存储可序列化的对象时)。
答案 1 :(得分:0)
您应该使CellCoord和FramingBlock可序列化以避免该错误。如果您不想序列化它们,则应将它们设置为瞬态。
答案 2 :(得分:-1)
如果类中定义的任何一个对象在扩展serializable时将具有非原始实例字段(既不是瞬态的,可序列化的),则不会正确地反序列化类的对象。因为如果类的任何对象想要保存它的状态,那么它将无法仅仅因为一个非原始的实例字段而不是瞬态的,可序列化的。