Предположим, у меня есть сериализуемый класс AppMessage
.Java Serializable Object to Byte Array
Я хотел бы передать его как byte[]
через сокеты на другой компьютер, где он перестраивается из полученных байтов.
Как я мог достичь этого?
Предположим, у меня есть сериализуемый класс AppMessage
.Java Serializable Object to Byte Array
Я хотел бы передать его как byte[]
через сокеты на другой компьютер, где он перестраивается из полученных байтов.
Как я мог достичь этого?
Подготовка байт для отправки:
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
}
}
Это не полный ответ, он просто рассказывает, как преобразовать класс Serializable в байтовый массив, но сам вопрос охватывает всю тему, включая RMI, построение объекта и деконструкцию, механизмы и версии сериализации и т. Д. И т. Д. И т. Д. – Esko
Это не так Я прочитал вопрос. Мне кажется, что его проблема заключается в том, как преобразовать объект в байт [] - а не как его отправить. –
Тейлор: да, вы поняли это правильно. Я хочу превратить объект в байт [] и передать его. можете ли вы также указать код о том, как включить этот байт [] в объект? – iTEgg
Лучший способ сделать это состоит в использовании 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>
И больше способов упоминается here
Кроме того, вся коллекция может быть импортирован. См this link
Добавлено накладные расходы? В этот момент также можно восстановить колесо. Серьезно, гораздо проще понять этот однострочный лайнер и уменьшить возможные ошибки (например, не закрывать поток в нужное время и еще много чего). – ALOToverflow
Это просто и просто, в отличие от 99% других ответов на этот точный вопрос. –
Я использовал ваш ответ, uris и не могу понять, почему я получаю «java.io.StreamCorruptedException: недопустимый заголовок потока: 3C3F786D»? –
Если вы используете Java> = 7, вы могли бы улучшить принятое решение с использованием try with resources:
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)
Нажмите на ссылку, чтобы Download org-apache-commons-lang.jar
Интеграция.баночка файл, нажав:
FileName ->Open Settings Medule ->Выберите модуль ->Зависимости ->Добавить Jar файл и вы сделали.
Надеюсь, что это поможет.
Почему именно 'byte []'? Почему бы просто не записать его прямо в сокет с помощью 'ObjectOutputStream' и прочитать его с помощью ObjectEputStream? – EJP
@wuhaochi Действительно ли вам нужен пример 'ObjectOutputStream.writeObject()' и 'ObiectInputStream.readObject()'? – EJP