【发布时间】:2017-01-15 20:34:03
【问题描述】:
我们在JDK 1.7 中使用HashMap,我在使用SonarQube 进行代码审查时遇到了一些问题。
请考虑以下示例:
public class SerializationTest implements Serializable {
private Map<String,String> test1=new HashMap<>(); //Serializeable
private Map<ANEnum,String> test2=new HashMap<>(); //Serializeable
private Map<String,ASerializeableObject> test3=new HashMap<>(); //Serializeable
private Map<String,Map<String,String>> test4=new HashMap<>(); //Not Serializeable
private Map<ANEnum,Map<String,String>> test5=new HashMap<>(); //Not Serializeable
private Map<String,Map<String, ASerializeableObject>> test6=new HashMap<>(); //Not Serializeable
Sonar 将最后三个 HashMaps 标记为不是 serializeable。声纳错误是 (Make "test4" transient or serializable)
据我猜测,HashMap 是 serializeable,如果它的键和值是 serializeable。但似乎如果我将一个HashMap 值设置为另一个HashMap,那么原来的HashMap 根本不会是serializeable。
这个声纳问题正确吗?!如果是我该如何解决?!
【问题讨论】:
-
要测试某些东西是否可序列化,请将其序列化。 Sonar 无法知道您的地图在运行时实际包含的内容是否可序列化。如果您询问声纳违规行为,请发布准确完整的消息和规则名称。
-
Sonarqube 方面的工作相当糟糕,因为变量是在同一个语句中声明和初始化的。
-
@EJP SOnar 不能保证地图是可序列化的,因为它包含
Map的实例,而Map是不可序列化的。在运行时,它可能是,但在编译时,你不能保证内部映射是可序列化的。 -
@JBNizet 规则名称为:
Fields in a "Serializable" class should either be transient or serializable(squid:S1948)。 -
亲爱的@JBNizet 似乎对于前三个示例,Sonar 保证了序列化,因为您不会在那里看到错误报告 :) 这可能是声纳中的错误。因为,Sonar 保证
Map<String,ASerializeableObject>是可序列化的(您将在代码审查中看到没有错误),但是当您将ASerializeableObject替换为已经提到的serializeable的Map<String,ASerializeableObject>时,最终结果Map<String,Map<String,ASerializeableObject>>是标记为不是serializeable。
标签: java serialization hashmap sonarqube