Kryo一般读写

时间:2015-05-12 07:06:43

标签: 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不需要弄清楚自己。但不确定这是否真实。根据他们看起来相似的速度。感谢

1 个答案:

答案 0 :(得分:1)

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

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

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