Java为什么映射的映射(例如:Map<;String,Map<;String,String>;)不可序列化

Java为什么映射的映射(例如:Map<;String,Map<;String,String>;)不可序列化,java,serialization,hashmap,sonarqube,Java,Serialization,Hashmap,Sonarqube,我们正在jdk1.7中使用HashMap,在使用sonaqube进行代码审查时,我遇到了一些问题 请考虑以下样品: public class SerializationTest implements Serializable { private Map<String,String> test1=new HashMap<>(); //Serializeable private Map<ANEnum,String> test2=new HashMa

我们正在
jdk1.7
中使用
HashMap
,在使用sonaqube进行代码审查时,我遇到了一些问题

请考虑以下样品:

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
public类SerializationTest实现可序列化{
私有映射test1=newhashmap();//可序列化
私有映射test2=newhashmap();//可序列化
私有映射test3=newhashmap();//可序列化
私有映射test4=newhashmap();//不可序列化
私有映射test5=newhashmap();//不可序列化
私有映射test6=newhashmap();//不可序列化
声纳将最后三个
HashMap
s标记为不可
serialized
。声纳错误为(
使“test4”暂时或可序列化

据我猜测,如果它的键和值是可序列化的,那么
HashMap
是可序列化的。但是,如果我将一个
HashMap
值设置为另一个
HashMap
,那么原始的
HashMap
将根本不可序列化


这个声纳问题正确吗?!如果是,我如何修复它?!

让我们逐一查看每一行:

private Map<String,String> test1=new HashMap<>();
私有映射test1=newhashmap();
键类型String是可序列化的。值类型String是可序列化的。具体映射类型HashMap是可序列化的。因此,所有内容都是可序列化的

private Map<ANEnum,String> test2=new HashMap<>(); 
private Map<String,ASerializeableObject> test3=new HashMap<>();
private Map<String,Map<String,String>> test4=new HashMap<>();
private-Map test2=new-HashMap();
键类型ANEnum是可序列化的。值类型String是可序列化的。具体映射类型HashMap是可序列化的。因此,所有内容都是可序列化的

private Map<ANEnum,String> test2=new HashMap<>(); 
private Map<String,ASerializeableObject> test3=new HashMap<>();
private Map<String,Map<String,String>> test4=new HashMap<>();
private-Map test3=new-HashMap();
键类型String是可序列化的。值类型AserizableObject是可序列化的。具体映射类型HashMap是可序列化的。因此,所有内容都是可序列化的

private Map<ANEnum,String> test2=new HashMap<>(); 
private Map<String,ASerializeableObject> test3=new HashMap<>();
private Map<String,Map<String,String>> test4=new HashMap<>();
private-Map test4=new-HashMap();
键类型String是可序列化的。具体映射类型HashMap是可序列化的。但值类型Map不一定是可序列化的。Map的一些具体实现(如HashMap),可序列化。其他一些不可序列化。因此Sonar无法保证此字段可序列化,并发出警告。如果您确定只将可序列化映射存储为值,则没有问题。如果存储不可序列化映射,则序列化将在运行时失败

private Map<ANEnum,Map<String,String>> test5=new HashMap<>(); //Not Serializeable
private Map test5=new HashMap();//不可序列化
和以前一样的解释

private Map<String,Map<String, ASerializeableObject>> test6=new HashMap<>();
private-Map test6=new-HashMap();
和以前一样的解释

private Map<String,Map<String, ASerializeableObject>> test6=new HashMap<>();

请记住,Sonar只是一个工具,它有时会有帮助,有时会妨碍。你应该控制自己,并决定警告是否应该让你改变事情。

要测试某个东西是否可序列化,请序列化它。Sonar无法知道你的地图在运行时实际包含的内容是否可序列化。如果你询问Sonar violation,发布准确完整的消息和规则名称。Sonarqube方面的工作相当糟糕,因为变量是在同一语句中声明和初始化的。@EJP SOnar不能保证映射是可序列化的,因为它包含
map
的实例,
map
不可序列化。在运行时,它可能是,但在编译时,您不能保证内部映射是可序列化的。@JBNizet规则名称是:
在“可序列化”类中的字段应该是暂时的或可序列化的(squid:S1948).Dear@JBNizet似乎对于第一个示例中的三个,Sonar保证了序列化,因为您不会在那里看到错误报告:)这可能是Sonar中的错误。因为Sonar保证
Map
是可序列化的(您在代码审查中不会看到错误),但当您将该
可序列化对象
替换为
映射
时,最终结果
映射
被标记为不
可序列化
。映射的一些具体实现(如HashMap),是可序列化的。其他一些不是…这是我不知道的!谢谢!