java - 在Java中序列化键值对的HashMap并将其转换为格式化字符串

标签 java string serialization hashmap deserialization

我将键值对的 HashMap 声明为,

HashMap<String, String> map = new HashMap<>();
map.put("key1", "value1");
map.put("key2", "value2");
map.put("key3", "value3");

我正在使用一种方法来序列化此 HashMap 并使用以下代码将其转换为字符串:

public static String serializeMetadata(HashMap<String, String> metadata) throws IOException {
    try(ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
        ObjectOutputStream oos = new ObjectOutputStream(baos)) {
        oos.writeObject(metadata);
        return baos.toString();
    }
}

当我调用serializeMetadata方法并将 HashMap 作为输入传递时,我希望 map 状态由ObjectOutputStream(oos)进行流式传输,并将字节数组存储在ByteArrayOutputStream(baos)中。当使用 baos 调用 toString() 时,我期望输出为

"{key1=value1, key2=value2, key3=value3}"

与我们将 HashMap 转换为字符串时的输出类型相同。相反,我得到一些不可读的格式化字符串,例如,

���sr�java.util.HashMap���`��F� loadFactorI� thresholdxp?@�����������t�key1t�value1t�key2t�value2t�key3t�value3x

我明白,如果我反序列化 baos,我会再次得到一个 HashMap ,如果我执行 toString(),我会得到我需要的格式。

当序列化 HashMap 转换为字符串时,我需要一个格式化字符串,所以, 1.我可以编写单元测试并断言字符串的 HashMap 2. 将该字符串(包含所有格式化的键和值)保留在数据库中以供将来的数据分析。 3. 我可以在应用程序中调用数据库中的字符串并将其反序列化回 HashMap 并继续使用现有状态。

我不需要 JSON 字符串。想象一下 HashMap 的所有键值对都存储在数据库的单个字段中。我找不到正确的解决方案,所以如果有任何重复的链接,请将它们放在评论中。任何帮助表示赞赏。谢谢!

最佳答案

ObjectOutputStream 以二进制格式输出,需要一个 ObjectInputStream 来读取。如果您也通过中间的字符串,它可能甚至无法工作。

最简单的解决方案可能是使用现有的类,例如 java.util.Properties,它继承自 Hashtable(并且也实现 Map),并且可以从另一个 Map 获取所有条目或充当一个。 属性可以通过加载/存储方法轻松存储到磁盘(基于行的字符串 key=value 和 xml 格式)。

保存到文本可读文件:

Properties<String, String> props = new Properties<>();
props.putAll(map);
props.store(...);

要再次阅读它们:

Properties<String, String> props = new Properties<>();
props.load(...);

map.putAll(props);
//or just use the props object as your Map as it implements the Map interface, 
//so instead just do this:
Map<String, String> map = props;

https://docs.oracle.com/javase/8/docs/api/java/util/Properties.html

关于java - 在Java中序列化键值对的HashMap并将其转换为格式化字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54118613/

相关文章:

java - 在 Java 程序中使用 Apache Ant API 以编程方式构建源文件

C malloc 字符串结构数组

string - 如何在 Julia 中获取字符串的子字符串?

C 连接字符串额外空格

c# - DataContractSerializer前向兼容性问题

c# - 进行语言间数据交换的优雅方式

java - 如何从 Java 日志文件中提取错误信息(日志记录后)

java - Struts 1.3 的替代品有哪些

java - 使用触摸事件移动 View

c# - DataContractSerialiser 和 Serializable 的问题