Сериализуемый объект Java в массив байтов
предположим, у меня есть сериализуемый класс AppMessage
.
Я хотел бы передать его как byte[]
через сокеты на другой компьютер, где он перестраивается из полученных байтов.
Как я мог этого добиться?
6 ответов
подготовьте байты для отправки:
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutput out = null;
try {
out = new ObjectOutputStream(bos);
out.writeObject(yourObject);
out.flush();
byte[] yourBytes = bos.toByteArray();
...
} finally {
try {
bos.close();
} catch (IOException ex) {
// ignore close exception
}
}
создать объект из байтов:
ByteArrayInputStream bis = new ByteArrayInputStream(yourBytes);
ObjectInput in = null;
try {
in = new ObjectInputStream(bis);
Object o = in.readObject();
...
} finally {
try {
if (in != null) {
in.close();
}
} catch (IOException ex) {
// ignore close exception
}
}
лучший способ сделать это-использовать SerializationUtils
от Apache Commons Lang.
для сериализации:
byte[] data = SerializationUtils.serialize(yourObject);
десериализовать:
YourObject yourObject = SerializationUtils.deserialize(data)
как уже упоминалось, для этого требуется библиотека Commons Lang. Его можно импортировать с помощью Gradle:
compile 'org.apache.commons:commons-lang3:3.5'
Maven:
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.5</version>
</dependency>
и другие способы, упомянутые здесь
кроме того, вся коллекция может быть импортированным. См.этой ссылке
Если вы используете Java >= 7, Вы можете улучшить принятое решение, используя попробуйте с ресурсов:
private byte[] convertToBytes(Object object) throws IOException {
try (ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutput out = new ObjectOutputStream(bos)) {
out.writeObject(object);
return bos.toByteArray();
}
}
и наоборот:
private Object convertFromBytes(byte[] bytes) throws IOException, ClassNotFoundException {
try (ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
ObjectInput in = new ObjectInputStream(bis)) {
return in.readObject();
}
}
можно сделать SerializationUtils, методом сериализации и десериализации методом ApacheUtils для преобразования объекта в байт[] и наоборот, как указано в ответе @uris.
чтобы преобразовать объект в байт[] путем сериализации:
byte[] data = SerializationUtils.serialize(object);
для преобразования байта[] в объект путем десериализации::
Object object = (Object) SerializationUtils.deserialize(byte[] data)
нажмите на ссылку скачать org-apache-commons-lang.Джар
интегрировать .jar-файл, нажав:
имя файла ->Открыть Настройки Medule ->выберите модуль ->зависимости ->Добавить файл Jar и вы сделали.
надеюсь, что это помогает.
Я также рекомендую использовать инструмент SerializationUtils. Я хочу сделать неправильный комментарий @Abilash. The SerializationUtils.serialize()
метод не ограничено 1024 байтами, вопреки другому ответу здесь.
public static byte[] serialize(Object object) {
if (object == null) {
return null;
}
ByteArrayOutputStream baos = new ByteArrayOutputStream(1024);
try {
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(object);
oos.flush();
}
catch (IOException ex) {
throw new IllegalArgumentException("Failed to serialize object of type: " + object.getClass(), ex);
}
return baos.toByteArray();
}
на первый, взгляд может показаться, что это new ByteArrayOutputStream(1024)
позволит только фиксированный размер. Но если вы внимательно посмотрите на ByteArrayOutputStream
, вы поймете, что поток будет расти, если это необходимо:
этот класс реализует выходной поток в какие данные записывается в массив байтов. Буфер автоматически растет, как данные написано ему. Данные могут быть получены с помощью
toByteArray()
иtoString()
.
Я хотел бы передать его как байт[] через сокеты на другую машину
// When you connect
ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
// When you want to send it
oos.writeObject(appMessage);
где он перестраивается из полученных байтов.
// When you connect
ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
// When you want to receive it
AppMessage appMessage = (AppMessage)ois.readObject();