Насколько мне известно, сериализация / десериализация Kryo происходит для каждого объекта. Можно ли сериализовать несколько объектов в один файл ?. Одним из обходных путей, предложенных в другом аналогичном вопросе SO, было использование массива объектов. Учитывая огромное количество данных, которые необходимо сериализовать, я считаю, что это будет не так эффективно, как должно быть. Это правильное предположение?
Сериализуйте несколько объектов в один файл с помощью Kryo
Ответы (2)
Принимает ли Kryo API OutputStream? Если это так, просто загрузите его одним и тем же OutputStream для сериализации нескольких файлов. Сделайте то же самое с InputStream при чтении. Хороший формат сериализации будет иметь кодировку длины или символы завершения и ни в чем не будет полагаться на EOF.
Массивный подход также будет работать с минимальными накладными расходами, если все эти объекты уже находятся в памяти. Вы говорите о добавлении всего нескольких байтов на объект для создания массива для их хранения. Если они не все в памяти, вам придется сначала загрузить их все в память, чтобы создать вокруг них массив. Это определенно может стать проблемой при наличии достаточно большого набора данных.
Поскольку 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);
}
}