当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《Java为什么Map的Map(例如:Map<String,Map<String,String>>)不可序列化》经验,为你挑选了1个好方法。

我们正在使用HashMapJDK 1.7,我和代码审查过程中面临的一些问题SonarQube.

请考虑以下样本:

public class SerializationTest implements  Serializable {

   private Map test1=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)

据我的猜测HashMapserializeable,如果它的键和值是serializeable.但似乎如果我将一个HashMap值设置为另一个HashMap,原始的HashMap根本就不会serializeable.

这个声纳问题是否正确?!如果是我该如何解决它?



1> JB Nizet..:

让我们一个接一个地看到每一行:

private Map test1=new HashMap<>();

键类型String是可序列化的.值类型String是可序列化的.具体的Map类型HashMap是可序列化的.所以一切都是可序列化的.

private Map test2=new HashMap<>(); 

密钥类型ANEnum是可序列化的.值类型String是可序列化的.具体的Map类型HashMap是可序列化的.所以一切都是可序列化的.

private Map test3=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<>();

和以前一样的解释

请记住,声纳只是一种工具,它有时会有所帮助,有时会妨碍它.你应该掌控,并决定警告是否应该让你改变事物.

推荐阅读
罗文彬2502852027
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有