我发现了两种使用 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/