То, что вы хотите сделать, называется " сериализация ".Есть несколько способов сделать это, но если вам не нужно ничего необычного, я думаю, что использование стандартной сериализации Java-объекта вполне подойдет.
Возможно, вы могли бы использовать что-то подобное?
package com.example;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public class Serializer {
public static byte[] serialize(Object obj) throws IOException {
try(ByteArrayOutputStream b = new ByteArrayOutputStream()){
try(ObjectOutputStream o = new ObjectOutputStream(b)){
o.writeObject(obj);
}
return b.toByteArray();
}
}
public static Object deserialize(byte[] bytes) throws IOException, ClassNotFoundException {
try(ByteArrayInputStream b = new ByteArrayInputStream(bytes)){
try(ObjectInputStream o = new ObjectInputStream(b)){
return o.readObject();
}
}
}
}
Есть несколько улучшений, которые можно сделать.Не в последнюю очередь тот факт, что вы можете читать / записывать только один объект на байтовый массив, что может быть или не быть тем, что вы хотите.
Обратите внимание, что "только объекты, которые поддерживают интерфейс java.io.Serializable
, могут быть записаны в потоки" (см. java.io.ObjectOutputStream
).
ПосколькуВы можете столкнуться с этим, непрерывное выделение и изменение размера java.io.ByteArrayOutputStream
может оказаться довольно узким местом.В зависимости от вашей модели потоков, вы можете рассмотреть возможность повторного использования некоторых объектов.
Для сериализации объектов, которые не реализуют интерфейс Serializable
, вам также нужно написать собственный сериализатор, например, с использованием read */ write * методы java.io.DataOutputStream
и get * / put * методы java.nio.ByteBuffer
возможно вместе с отражением или получить стороннюю зависимость.
Этот сайт содержит список и сравнение производительности некоторых платформ сериализации.Глядя на API, кажется, что Kryo может соответствовать тому, что вам нужно.