我将键值对的 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/