Сериализуйте несколько объектов в один файл с помощью Kryo

Насколько мне известно, сериализация / десериализация Kryo происходит для каждого объекта. Можно ли сериализовать несколько объектов в один файл ?. Одним из обходных путей, предложенных в другом аналогичном вопросе SO, было использование массива объектов. Учитывая огромное количество данных, которые необходимо сериализовать, я считаю, что это будет не так эффективно, как должно быть. Это правильное предположение?


person Harsha Hulageri    schedule 05.03.2011    source источник


Ответы (2)


Принимает ли Kryo API OutputStream? Если это так, просто загрузите его одним и тем же OutputStream для сериализации нескольких файлов. Сделайте то же самое с InputStream при чтении. Хороший формат сериализации будет иметь кодировку длины или символы завершения и ни в чем не будет полагаться на EOF.

Массивный подход также будет работать с минимальными накладными расходами, если все эти объекты уже находятся в памяти. Вы говорите о добавлении всего нескольких байтов на объект для создания массива для их хранения. Если они не все в памяти, вам придется сначала загрузить их все в память, чтобы создать вокруг них массив. Это определенно может стать проблемой при наличии достаточно большого набора данных.

person Konstantin Komissarchik    schedule 05.03.2011
comment
Буфер / поток во время сериализации / десериализации тесно сопоставлен с классом. Вышеупомянутый подход может не сработать. Дай мне попробовать. - person Harsha Hulageri; 09.03.2011
comment
Объектов нет в памяти. Таким образом, массивный подход будет проблемой - person Harsha Hulageri; 09.03.2011
comment
Ответ правильный, Kryo v2 поддерживает потоковую передачу. Последовательно записать объекты в файл. Прочтите их по одному из файла. - person NateS; 15.06.2012

Поскольку 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);

    }


}
person Richard Tingle    schedule 07.01.2014