我们正在使用HashMap
中JDK 1.7
,我和代码审查过程中面临的一些问题SonarQube.
请考虑以下样本:
public class SerializationTest implements Serializable { private Maptest1=new HashMap<>(); //Serializeable private Map test2=new HashMap<>(); //Serializeable private Map test3=new HashMap<>(); //Serializeable private Map > test4=new HashMap<>(); //Not Serializeable private Map > test5=new HashMap<>(); //Not Serializeable private Map > test6=new HashMap<>(); //Not Serializeable
声纳标记最后三个HashMap
不是serializeable
.声纳错误是(Make "test4" transient or serializable
)
据我的猜测HashMap
是serializeable
,如果它的键和值是serializeable
.但似乎如果我将一个HashMap
值设置为另一个HashMap
,原始的HashMap
根本就不会serializeable
.
这个声纳问题是否正确?!如果是我该如何解决它?
让我们一个接一个地看到每一行:
private Maptest1=new HashMap<>();
键类型String是可序列化的.值类型String是可序列化的.具体的Map类型HashMap是可序列化的.所以一切都是可序列化的.
private Maptest2=new HashMap<>();
密钥类型ANEnum是可序列化的.值类型String是可序列化的.具体的Map类型HashMap是可序列化的.所以一切都是可序列化的.
private Maptest3=new HashMap<>();
键类型String是可序列化的.值类型ASerializeableObject是可序列化的.具体的Map类型HashMap是可序列化的.所以一切都是可序列化的.
private Map> test4=new HashMap<>();
键类型String是可序列化的.具体的Map类型HashMap是可序列化的.但是值类型Map 不一定是可序列化的.Map的一些具体实现(如HashMap)是可序列化的.其他一些则不是.因此Sonar无法保证此字段是可序列化的,并发出警告.如果您确定只将可序列化地图存储为值,则没问题.如果存储不可序列化的映射,则序列化将在运行时失败.
private Map> test5=new HashMap<>(); //Not Serializeable
和以前一样的解释
private Map> test6=new HashMap<>();
和以前一样的解释
请记住,声纳只是一种工具,它有时会有所帮助,有时会妨碍它.你应该掌控,并决定警告是否应该让你改变事物.