Хранить крио-объект в скомпилированном банке?

У меня есть 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 записей.

Теперь я хотел бы получить доступ к моему файлу .kryo после компиляции *-jar-with-dependencies.jar (я использую Maven). Итак, вместо 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 просто не может его десериализовать и не выдает никаких ошибок.


person dranxo    schedule 19.05.2014    source источник


Ответы (1)


Оказывается, проблема была с Maven. У меня была включена «фильтрация», поэтому Maven пытался кодировать 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>
person dranxo    schedule 20.05.2014