java - Kryo 通用读写

标签 java generics kryo

我发现了两种使用 Kryo 进行读写的通用方法,我在想其中一种是更好还是更差,或者它们是否完全相同。

选项 1 - 使用 kryo 函数 writeClassAndObject (readClassAndObject)

public <T> void writeK(T obj, String fileName) {
    checkDir(path);
    Kryo kryo = new Kryo();
    Output output = null;
    try {
        output = new Output(new FileOutputStream(homePath + path + "/" + "kryo_" + fileName + ".bin"));
        kryo.writeClassAndObject(output, obj);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } finally {
        output.close();
    }

}

选项 2 - 使用 writeObject (readObject) 和类信息

public <T> void writeKryo(Class<T> cl, T obj, String fileName) {
    checkDir(path);
    Kryo kryo = new Kryo();
    kryo.register(cl);

    Output output = null;
    try {
        output = new Output(new FileOutputStream(homePath + path + "/" + "kryo_" + fileName + ".bin"));
        kryo.writeObject(output, obj);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } finally {
        output.close();
    }
}

看起来第二个选项更好,因为在调用函数时我指定了那个类,所以 Java 不需要弄清楚它自己。但不确定这是否属实。从速度来看,它们似乎具有可比性。谢谢

最佳答案

这取决于您在反序列化数据时是否可以从上下文中知道序列化数据代表的类实例。使用writeClassAndObject时,在读取对象时不需要指定类。您可以反序列化数据,然后在此实例上调用 getClass

相比之下,当使用writeObject时,您在读取它时需要知道存储对象的类。否则,您无法反序列化数据,因为该信息未存储在序列化数据中。

当(反)序列化一个对象时,选择哪种方法并不重要,因为您可以选择两种方法。但是,想象一下这样一个场景:您一次又一次地序列化同一类的实例。当不将类与每个实例一起存储时,序列化数据的大小可以显着减小。相反,您可以在文件开头序列化类名,甚至简单地将其硬编码到反序列化器中。

关于java - Kryo 通用读写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30184019/

相关文章:

java - 全屏启动器应用程序来自后台后,Android NFC 读取失败

java - 如何使用 XPath 在 java 中查找带有 CDATA 标记的节点值

java - 什么是 PECS(生产者扩展消费者 super )?

java - Kryo throw "Encountered unregistered class ID: 44"

java - 在java中将字符串转换为日期

java - Selenium 3.3.1 : NoDefClassFound (com. google.common.base.Function)

c# - 带表格的通用 CSV 导出

C# 泛型下限约束 "where MySubClass : T"(java 的 "super")

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

java - 如何使用 Kryo 序列化对象并再次反序列化?