当前位置: 首页 > 知识库问答 >
问题:

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

於意蕴
2023-03-14

考虑以下代码:

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接口的类。类CellCoordFraming Block是带有一堆getter和setter的POJOS。FindBugs抱怨editingCellframing Block字段说:

这个Serializable类定义了一个非基元实例字段,它既不是瞬态的、Serializable的,也不java.lang.Object的,并且似乎没有实现Externalizable接口或readObject()和WriteObject()方法。

好吧,所以一切都很好,除了为什么说实例字段不是“java.lang.对象”。这完全是误导,或者我错过了一些基础知识?

共有3个答案

濮阳君浩
2023-03-14

类的对象将不会被正确反序列化,如果有任何一个对象定义的类扩展的可序列化将具有非基元实例字段,这既不是瞬态的,Serializable.因为如果类的任何对象想要保存其状态,它将无法这样做,仅仅因为一个非基元实例字段,这既不是瞬态的,Serializable.

楚良平
2023-03-14

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

井学
2023-03-14

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

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

 类似资料:
  • 我有一个没有扩展可串行化或可外部化接口的类,但在netbeans中使用FindBugs时仍然会遇到错误。有人能告诉我如何解决这个问题吗? 这是我的课 FindBug中的Bug:类分析器定义了一个非瞬时的非序列化实例字段objAnalyzerVar,对于objAnalyzerDataTypeInfo也是如此;

  • 问题内容: 考虑下面的类。如果我对它运行Findbugs,它将在第5行而不是在第7行给我一个错误(“可序列化类中的非瞬态不可序列化实例字段”)。 这是正确的,因为java.util.Set从未在其层次结构中实现Serializable,而java.util.HashSet却没有实现。但是,最佳实践是针对接口而不是具体的实现进行编码。 我该如何最好地处理呢? 我可以在第3行上添加一个@Suppres

  • 嗨,我在声纳皮棉中收到此错误: “Serializable”类中的字段应该是暂时的或可序列化的 私有最终条件notEmpty=锁定。newCondition() 我的代码是: 有人能提供解决方案,使sonar不会显示所有三个变量的这些错误吗?

  • 我遇到了下面的问题,请让我知道是否有人以前见过这个,真的让我疯狂地想如何前进。 我有两个实体- 当我在类B上运行SonarQube分析时,我看到S1948弹出,我只是不确定我还能在这里做什么,类A和B是可序列化的,并且确实拥有所有可序列化的成员字段。 请让我知道,如果这已经解决之前。 提前感谢!

  • 问题内容: 我在android / java中对Location的子类进行序列化遇到了麻烦 位置不可序列化。我有一个名为FALocation的第一个子类,它没有任何实例变量。我已经宣布它可序列化。 然后,我有一个名为Waypoint的第二个类,看起来像这样: 序列化工作正常。 反序列化会产生跟随翼异常(腿对象包含一个航路点): 问题答案: 序列化位置绝对必要吗?也许您可以将其标记为瞬态,并在反序列

  • 问题内容: 有效的Java-要保持单例保证,您必须声明所有实例字段都是瞬态的,并提供一个“ readResolve”方法。通过在此处声明瞬态场能实现什么?这是一个示例: 无论我是否将’state’变量声明为瞬态,我都会将c.getState()gettign打印为25。我在这里缺少什么吗? 问题答案: 通过使属性变为瞬态而获得的好处是,您无需序列化状态。序列化是不必要的,因为无论如何它都会被rea