【发布时间】:2017-12-04 02:30:53
【问题描述】:
我需要从我序列化的十六进制字符串中获取哈希图。目前,我可以获得哈希图,但它会创建一个 EOFException。
private static String writeMaterialMap(HashMap<String, Double> map) throws Exception {
System.out.print(map);
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
objectOutputStream.writeObject(map);
objectOutputStream.close();
byte[] bytes = byteArrayOutputStream.toByteArray();
final StringBuilder stringBuilder = new StringBuilder();
for (byte bytte : bytes) {
stringBuilder.append(String.format("%02x", bytte));
}
System.out.print("Saving: " + stringBuilder.toString());
return stringBuilder.toString();
}
@SuppressWarnings("unchecked")
private static HashMap<String, Double> readMaterialMap(String hex) throws Exception {
int length = hex.length();
byte[] byteArray = new byte[length / 2];
for (int i = 0; i < length; i += 2) {
byteArray[i / 2] = (byte) ((Character.digit(hex.charAt(i), 16) << 4)
+ Character.digit(hex.charAt(i + 1), 16));
}
ObjectInputStream objectInputStream = new ObjectInputStream(new ByteArrayInputStream(byteArray));
System.out.print(objectInputStream.readObject());
HashMap<String, Double> materials = new HashMap<>((Map<String, Double>) objectInputStream.readObject());
System.out.print(materials);
return materials;
}
目前,我明白了:
{"A"=1}
{}
java.io.EOFException
at java.io.ObjectInputStream$BlockDataInputStream.peekByte
at java.io.ObjectInputStream.readObject0
at java.io.ObjectInputStream.readObject
at me.MapHex.readMaterialMap(MineHex.java:66)
从中我可以看到:它可以读取对象,但 EOFE 阻止我将其转换为 HashMap。我需要将其转换为没有 EOFE 的 HashMap
【问题讨论】:
-
您在输出中看到的空地图是您自己毫无意义地创建的地图,而不是
readObject()的结果,它抛出了异常而不是返回地图,因此,您也没有达到类型转换的程度。 -
是的!我知道!! :P 那是我的问题。
-
您的新代码也毫无意义。您根本不需要
new HashMap<...>()部分。只是readObject()和类型转换。你似乎只是在猜测。 -
我完全知道我可以内联变量...这并不能解决问题
标签: java serialization hashmap eofexception