使用Kryo将多个对象序列化为单个文件

时间:2011-03-05 04:07:37

标签: java serialization kryo

据我所知,每个对象都会发生Kryo序列化/反序列化。是否可以将多个对象序列化为单个文件?在另一个类似的SO问题中提出的解决方法之一是使用一组对象。考虑到需要序列化的大量数据,我觉得它不会像应有的那样高效。这是正确的假设吗?

2 个答案:

答案 0 :(得分:2)

Kryo API是否采用OutputStream?如果是这样,只需输入相同的OutputStream来序列化多个文件。读取时对InputStream执行相同操作。良好的序列化格式将具有长度编码或终止符号,并且不会依赖于EOF。

只要所有这些对象都已在内存中,阵列方法也可以以最小的开销工作。您所说的是每个对象只添加几个字节来创建一个数组来保存它们。如果它们不是全部都在内存中,则必须首先将它们全部加载到内存中以围绕它们创建一个数组。鉴于数据集足够大,这肯定会成为一个问题。

答案 1 :(得分:2)

由于Kryo支持流式传输,因此没有什么可以阻止你在“顶层”写入/读取多个对象到kryo。例如,以下程序将两个不相关的对象写入文件,然后再次反序列化

public class TestClass{


    public static void main(String[] args) throws FileNotFoundException{
        serialize();
        deSerialize();
    }

    public static void serialize() throws FileNotFoundException{
        Collection<String>collection=new ArrayList<>();
        int otherData=12;


        collection.add("This is a serialized collection of strings");

        Kryo kryo = new Kryo();
        Output output = new Output(new FileOutputStream("testfile"));
        kryo.writeClassAndObject(output, collection);
        kryo.writeClassAndObject(output, otherData); //we could add as many of these as we like
        output.close();
    }

    public static void deSerialize() throws FileNotFoundException{
        Collection<String>collection;
        int otherData;

        Kryo kryo = new Kryo();
        Input input = new Input(new FileInputStream("testfile"));
        collection=(Collection<String>)kryo.readClassAndObject(input);
        otherData=(Integer)kryo.readClassAndObject(input);

        input.close();

        for(String string: collection){
            System.out.println(string);
        }

        System.out.println("There are other things too! like; " + otherData);

    }


}