在编译的jar中存储kryo对象?

时间:2014-05-19 22:32:06

标签: java serialization kryo

我有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似乎无法反序列化它并且不会提供任何错误。

1 个答案:

答案 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>