gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 06:47:42 24 4
gpt4 key购买 nike

我有一个 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com