Java Kryo一般读写

Java Kryo一般读写,java,generics,kryo,Java,Generics,Kryo,我发现了两种使用Kryo进行阅读和写作的方法,我在思考其中一种是更好还是更差,或者它们是一样的 选项1-使用kryo函数writeClassAndObject(readClassAndObject) public void writeK(T obj,字符串文件名){ checkDir(路径); Kryo Kryo=新Kryo(); 输出=空; 试一试{ 输出=新的输出(新文件输出流(homePath+path+“/”+“kryo_”+fileName+“.bin”); writeClassAnd

我发现了两种使用Kryo进行阅读和写作的方法,我在思考其中一种是更好还是更差,或者它们是一样的

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

public void writeK(T obj,字符串文件名){
checkDir(路径);
Kryo Kryo=新Kryo();
输出=空;
试一试{
输出=新的输出(新文件输出流(homePath+path+“/”+“kryo_”+fileName+“.bin”);
writeClassAndObject(输出,对象);
}catch(filenotfounde异常){
e、 printStackTrace();
}最后{
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();
    }
}
public void writeKryo(类cl,T obj,字符串文件名){
checkDir(路径);
Kryo Kryo=新Kryo();
kryo.寄存器(cl);
输出=空;
试一试{
输出=新的输出(新文件输出流(homePath+path+“/”+“kryo_”+fileName+“.bin”);
kryo.writeObject(输出,对象);
}catch(filenotfounde异常){
e、 printStackTrace();
}最后{
output.close();
}
}

第二个选项似乎更好,因为在调用函数时,我指定了它是什么类,这样Java就不需要了解自己了。但不确定这是不是真的。从速度来看,它们似乎是可比的。谢谢

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

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


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

我正在使用它创建数百个文件。。我也不知道你说的对不对。读写对象应该更好地用于多个文件,因为这?我做对了吗,所以我不需要用数据存储信息?如果您知道每个文件包含哪些对象,而不将这些信息写入文件,请使用
writeObject
方法。如果需要将此信息存储在文件中,请使用
writeObjectAndClass
。如果打开序列化文件,您将在后一个文件中找到类信息,但在第一个文件中找不到。因此,后一个文件的大小更大。通过使用
writeObject
方法,可以节省此空间。
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();
    }
}