如何序列化复杂的Map对象?

时间:2018-11-05 20:57:11

标签: java serialization hashmap

我必须在只能传输字符串的系统上传递对象。序列化非常适合我需要的东西,但是我无法让此指标对象正确地序列化。

Java创建对象:

Map<String, HashMap<String, String>> metrics = new HashMap<String, HashMap<String, String>>();
String serializedObject = "";
            try {
                 ByteArrayOutputStream bo = new ByteArrayOutputStream();
                 ObjectOutputStream so = new ObjectOutputStream(bo);
                 so.writeObject(metrics);
                 so.close();
                 serializedObject = bo.toString();
            } catch (Exception e) {
                 System.out.println(e);
            }

…将serializedObject作为字符串传递…

Java将对象重新消毒成度量对象。

Map<String, HashMap<String, String>> metrics = new HashMap<String, HashMap<String, String>>();

try {
                 byte b[] = serializedObject.getBytes(); 
                 ByteArrayInputStream bi = new ByteArrayInputStream(b);
                 ObjectInputStream si = new ObjectInputStream(bi);
                 metrics = (Map<String, HashMap<String, String>>) si.readObject();
                 si.close();
            } catch (Exception e) {
                 System.out.println(e);
            }

我没有收到错误,但是打印出序列化对象的字节表明它太小了,无法成为我正在序列化的数据。

1 个答案:

答案 0 :(得分:0)

那是因为您正在使用byte[]StringtoString()映射到getBytes()。那将行不通,因为此String方法并非旨在处理随机字节序列,因此您的序列化数据将被破坏。

如果您需要转移byte[]进行编写,然后使用InputStream.read()OutputStream.write()进行读取。例如,只需将byte[]new ByteArrayInputStream(bo.toByteArray())一起传递就可以了:

Map<String, Map<String, String>> metrics = new HashMap<>();
metrics.put("test", new HashMap<>());

ByteArrayOutputStream bo = new ByteArrayOutputStream();

ObjectOutputStream so = new ObjectOutputStream(bo);
so.writeObject(metrics);
so.close();

ByteArrayInputStream bi = new ByteArrayInputStream(bo.toByteArray());
ObjectInputStream si = new ObjectInputStream(bi);
Map<String, Map<String, String>> result = (Map<String, Map<String, String>>) si.readObject();
si.close();

System.out.println(result.equals(metrics)); // true