Вопрос-ответ

Java Serializable Object to Byte Array

Сериализуемый объект Java в массив байтов

Допустим, у меня есть сериализуемый класс AppMessage.

Я хотел бы передать его как byte[] через сокеты на другую машину, где он будет перестроен из полученных байтов.

Как я мог этого добиться?

Переведено автоматически
Ответ 1

Подготовьте массив байтов для отправки:

ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream 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
}
}
Ответ 2

Лучший способ сделать это - использовать 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>

Jar-файл

И другие способы, упомянутые здесь

В качестве альтернативы можно импортировать всю коллекцию целиком. Обратитесь к этой ссылке

Ответ 3

Если вы используете Java >= 7, вы могли бы улучшить принятое решение, используя попробовать с ресурсами:

private byte[] convertToBytes(Object object) throws IOException {
try (ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(bos)) {
out.writeObject(object);
return bos.toByteArray();
}
}

И наоборот:

private Object convertFromBytes(byte[] bytes) throws IOException, ClassNotFoundException {
try (ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
ObjectInputStream in = new ObjectInputStream(bis)) {
return in.readObject();
}
}
Ответ 4

Может быть выполнено с помощью SerializationUtils, с помощью метода serialize & deserialize в ApacheUtils для преобразования объекта в byte[] и наоборот , как указано в ответе @uris .

Преобразовать объект в байт [] путем сериализации:

byte[] data = SerializationUtils.serialize(object);

Преобразовать байт [] в объект путем десериализации::

Object object = (Object) SerializationUtils.deserialize(byte[] data)

Нажмите на ссылку, чтобы скачать org-apache-commons-lang.jar

Интегрировать .файл jar, нажав:

Имя файла -> Откройте настройки Medule -> Выберите свой модуль -> Зависимости -> Добавьте Jar-файл, и все готово.

Надеюсь, это поможет.

java serialization