我必须在只能传输字符串的系统上传递对象。序列化非常适合我需要的东西,但是我无法让此指标对象正确地序列化。
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);
}
我没有收到错误,但是打印出序列化对象的字节表明它太小了,无法成为我正在序列化的数据。
答案 0 :(得分:0)
那是因为您正在使用byte[]
和String
将toString()
映射到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