Сериализация нескольких объектов в один файл с помощью Kryo - PullRequest
5 голосов
/ 05 марта 2011

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

Ответы [ 2 ]

2 голосов
/ 07 января 2014

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

    }


}
2 голосов
/ 05 марта 2011

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

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

...