如何保存和加载 HashMap<String,Object>?

Posted

技术标签:

【中文标题】如何保存和加载 HashMap<String,Object>?【英文标题】:How to save and load a HashMap<String,Object>? 【发布时间】:2012-10-23 18:22:26 【问题描述】:

哈希映射

public Map<String, BarrackData> barrack = new HashMap<String, BarrackData>();

兵营数据.java

public class BarrackData 
int A;
int B;
int C;
int D;
int E;
String Title;

public BarrackData(int a, int b, int c, int d, int e, String title) 
    A = a;
    B = b;
    C = c;
    D = d;
    P = p;
    Title = title;

如何保存这个 HashMap? 并加载它? 我用 Objectin/outputstream 尝试了不同的方法, 它以 NotSerializable、ObjectSteam 和 IO 异常告终, 我不知道如何处理它们。

【问题讨论】:

公平地说,它不是Serializable 【参考方案1】:

只有Serializable 类可以序列化:只需将implements Serializable 添加到您的类中即可:

public class BarrackData implements Serializable 

请注意,要真正序列化,类中的所有字段都必须是Serializable,但是java原语、数组(如果元素类型是Serializable)、java.lang类(如String ) 和Collections(如果元素类型是Serializable)是Serializable,所以你没问题。

【讨论】:

感谢您的帮助,当我尝试实现 Serializable 时,Eclipse 要求添加 Serial 版本 ID 或 @SuppressWarnings("serial")。所以我不明白我必须选择什么以及为什么。 你不需要那个序列号。这是为了保护您在更改类字段类型/编号后免于反序列化(假设您还更改了序列版本 ID)。如果你愿意,请忽略它 - 它是安全的【参考方案2】:

要完成答案,请注意keySet()的结果属于HashMap(如果您随时需要)不是Serializable

确实,键不应该与HashMap 相关的值分离。

【讨论】:

【参考方案3】:

您必须使您的 Object 类可序列化(为其提供 serialize() 和 deserialize() 方法,将其转换为字符串或可以保存/加载的字符串)。显然,HashMap 促进了开箱即用的某种程度的序列化。

这里是Java序列化教程的链接:http://www.tutorialspoint.com/java/java_serialization.htm

这里有一些关于 HashMap 序列化的更详细信息: Serializing and deserializing a map with key as string

正如 Bohemian 所说,实现 Serializable 是执行此操作的标准方法。

【讨论】:

以上是关于如何保存和加载 HashMap<String,Object>?的主要内容,如果未能解决你的问题,请参考以下文章

Java Spark 如何将 JavaPairRDD<HashSet<String>, HashMap<String, Double>> 保存到文件中?

Java:如何保存SET 作为HashMap中的值?

切换按钮的保存和加载状态

如何从 ArrayList<HashMap<String, String>> android 中获取所有元素

Solana Rust 程序 HashMap<string, u64>

java中如何把hashmap转换成object数组