gpt4 book ai didi

Java 为什么 Map of Map (ex : Map>) 不可序列化

转载 作者:行者123 更新时间:2023-11-30 06:07:22 26 4
gpt4 key购买 nike

我们在 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 将最后三个 HashMap 标记为不可serializeable。 Sonar 错误是 (Make "test4"transient or serializable)

据我猜测,如果 HashMap 的键和值是可序列化的,则它是可序列化的。但似乎如果我将一个 HashMap 值设置为另一个 HashMap,原始 HashMap 将不会是 serializeable全部。

这个 Sonar 问题正确吗?!如果是,我该如何解决?!

最佳答案

让我们逐行查看:

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

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

private Map<ANEnum,String> test2=new HashMap<>(); 

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

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

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

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

键类型 String 是可序列化的。具体的 Map 类型 HashMap 是可序列化的。 但是值类型 Map 不是必然可序列化的。 Map 的一些具体实现(如 HashMap)是可序列化的。其他一些则不是。所以Sonar不能保证这个字段是可序列化的,并发出警告。如果您确定只将可序列化映射存储为值,那没问题。如果您存储不可序列化的映射,那么序列化将在运行时失败。

private Map<ANEnum,Map<String,String>> test5=new HashMap<>(); //Not Serializeable

和之前一样的解释

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

和之前一样的解释

请记住,Sonar 只是一种工具,它有时会有所帮助,有时会成为障碍。您应该控制一切,并决定警告是否应该让您做出改变。

关于Java 为什么 Map of Map (ex : Map<String, Map<String,String>>) 不可序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41659466/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com