考虑下面的类。如果我对它运行Findbugs,它将在第5行而不是在第7行给我一个错误(“可序列化类中的非瞬态不可序列化实例字段”)。
1 public class TestClass implements Serializable {
2
3 private static final long serialVersionUID = 1905162041950251407L;
4
5 private Set<Integer> mySet; // Findbugs error
6
7 private HashSet<Integer> myOtherSet;
8
9 }
这是正确的,因为java.util.Set从未在其层次结构中实现Serializable,而java.util.HashSet却没有实现。但是,最佳实践是针对接口而不是具体的实现进行编码。
我该如何最好地处理呢?
我可以在第3行上添加一个@Suppresswarnings(justification =“ No bug”,values =“
SE_BAD_FIELD”)。我的实际代码中有很多Sets和Lists,我担心它会乱码。
有更好的方法吗?
但是,最佳实践是针对接口而不是具体的实现进行编码。
我认为不可以,在这种情况下不是。Findbugs完全正确地告诉您,NotSerializableException
一旦您Set
在该字段中拥有不可序列化的实现,便有可能碰上a
。这是您应该处理的事情。如何,这取决于您的班级设计。
Serializable
。为此,请创建一个界面SerializableSet extends Set, Serializable
并将其用于您的字段。然后,要么:
SerializableSet
公共接口,并提供实现它的实现类。instanceof Serializable
,如果不是,则将它们复制到实际的集合中。考虑以下代码: 现在扩展了一个实现接口的类。类和是带有一堆getter和setter的POJOS。FindBugs抱怨和字段说: 这个Serializable类定义了一个非基元实例字段,它既不是瞬态的、Serializable的,也不java.lang.Object的,并且似乎没有实现Externalizable接口或readObject()和WriteObject()方法。 好吧,所以一切都很好
我有一个没有扩展可串行化或可外部化接口的类,但在netbeans中使用FindBugs时仍然会遇到错误。有人能告诉我如何解决这个问题吗? 这是我的课 FindBug中的Bug:类分析器定义了一个非瞬时的非序列化实例字段objAnalyzerVar,对于objAnalyzerDataTypeInfo也是如此;
嗨,我在声纳皮棉中收到此错误: “Serializable”类中的字段应该是暂时的或可序列化的 私有最终条件notEmpty=锁定。newCondition() 我的代码是: 有人能提供解决方案,使sonar不会显示所有三个变量的这些错误吗?
我遇到了下面的问题,请让我知道是否有人以前见过这个,真的让我疯狂地想如何前进。 我有两个实体- 当我在类B上运行SonarQube分析时,我看到S1948弹出,我只是不确定我还能在这里做什么,类A和B是可序列化的,并且确实拥有所有可序列化的成员字段。 请让我知道,如果这已经解决之前。 提前感谢!
问题内容: 我在android / java中对Location的子类进行序列化遇到了麻烦 位置不可序列化。我有一个名为FALocation的第一个子类,它没有任何实例变量。我已经宣布它可序列化。 然后,我有一个名为Waypoint的第二个类,看起来像这样: 序列化工作正常。 反序列化会产生跟随翼异常(腿对象包含一个航路点): 问题答案: 序列化位置绝对必要吗?也许您可以将其标记为瞬态,并在反序列
问题内容: 有效的Java-要保持单例保证,您必须声明所有实例字段都是瞬态的,并提供一个“ readResolve”方法。通过在此处声明瞬态场能实现什么?这是一个示例: 无论我是否将’state’变量声明为瞬态,我都会将c.getState()gettign打印为25。我在这里缺少什么吗? 问题答案: 通过使属性变为瞬态而获得的好处是,您无需序列化状态。序列化是不必要的,因为无论如何它都会被rea