1

我有一个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 后访问我的 .kryo 文件(我正在使用 Maven)。因此,我使用的不是FileInputStream读取自 的 asrc/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 个条目。为什么?isris not null 所以它正在读取一些东西,Kryo 似乎无法反序列化它并且不提供任何错误。

4

1 回答 1

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>
于 2014-05-20T00:04:59.577 回答