java - 将 kryo 对象存储在已编译的 jar 中?

标签 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 显示我的 map 中有 231,045 个条目。

现在,我想在编译 *-jar-with-dependency.jar (我使用 Maven)后访问我的 .kryo 文件。因此,我使用 MyClass.class.getResourceAsStream

,而不是从 src/main/resources/ 读取的 FileInputStream
    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 说我的 map 中有 0 个条目。为什么? isr 不为 null,因此它正在读取某些内容,Kryo 似乎无法反序列化它并且不会提供任何错误。

最佳答案

事实证明问题出在 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>

关于java - 将 kryo 对象存储在已编译的 jar 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23748254/

相关文章:

apache-spark - java序列化与kryo序列化的优缺点是什么?

laravel - 如何在laravel数据表中添加行号或序列号

java - 如何在不创建另一个类的情况下创建内部 child ?

java - 使用 newString(bytes[]) 将缓存键存储在 hazelcast 缓存中

java - kryo 序列化是否适用于不可序列化的类并且类具有不可序列化的属性?

java - Serializable - writeObject()/ReadObject 和 Externalizable - Java 中的 readExternal()/writeExternal() 有什么区别?

java - 线程 "main"java.lang.OutOfMemoryError : Java heap space 中的异常

java - 解析从 API 获取的对象列表

java - 在 spring boot 应用程序中测试 websocket

java - 在 Java 8 中基于列表过滤 HashMap