Kryo 一般读写

Kryo read and write generically

我发现了两种使用 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) 和 Class 信息

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();
    }
}

似乎第二个选项更好,因为在调用函数时我指定了 class 是什么,所以 Java 不需要弄清楚自己。但不确定这是不是真的。根据速度,它们似乎具有可比性。谢谢

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

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

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