我有HashMap
我想要坚持并快速访问。我使用Kryo来序列化对象
Kryo kryo = new Kryo();
MapSerializer serializer = new MapSerializer();
kryo.register(Location.class);
kryo.register(HashMap.class, serializer);
Output output = new Output(new FileOutputStream("src/main/resources/locations50K.kryo"));
kryo.writeObject(output, locationMap);
output.close();
我可以使用
成功反序列化 Input input = new Input(new FileInputStream("src/main/resources/locations50K.kryo"));
Map<String, Location> locationMap;
locationMap = kryo.readObject(input, HashMap.class);
input.close();
log.info(locationMap.size());
log.info显示我的地图中有231,045个条目。
现在,我想在编译* -jar-with-dependencies.jar(我使用Maven)后访问我的.kryo文件。因此,我使用FileInputStream
src/main/resources/
读取的MyClass.class.getResourceAsStream
。
InputStream isr = MyClass.class.getResourceAsStream("/locations50K.kryo");
if(isr == null)
log.error("null input");
Input input = new Input(isr);
locationMap = kryo.readObject(input, HashMap.class);
input.close();
log.info(locationMap.size());
log.error从不显示,log.info表示我的地图中有0个条目。为什么? isr
不是空的,所以它正在读取内容,Kryo似乎无法反序列化它并且不会提供任何错误。
答案 0 :(得分:1)
原来问题是Maven。我启用了“过滤”,因此Maven试图在jar中对utf8编码我的序列化对象。 Kryo对此保持沉默,但重写代码以使用标准Java序列化会在此处找到错误:https://stackoverflow.com/a/5421992/424631
以下是修复:
<resources>
<resource>
<directory>src/main/resources</directory>
<!--if true Maven will try to UTF-8 encode objects, which breaks deserialization-->
<filtering>false</filtering>
</resource>
</resources>