2010-05-14 4 views
214

Предположим, у меня есть сериализуемый класс AppMessage.Java Serializable Object to Byte Array

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

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

+1

Почему именно 'byte []'? Почему бы просто не записать его прямо в сокет с помощью 'ObjectOutputStream' и прочитать его с помощью ObjectEputStream? – EJP

+0

@wuhaochi Действительно ли вам нужен пример 'ObjectOutputStream.writeObject()' и 'ObiectInputStream.readObject()'? – EJP

ответ

327

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

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 
    } 
} 
+4

Это не полный ответ, он просто рассказывает, как преобразовать класс Serializable в байтовый массив, но сам вопрос охватывает всю тему, включая RMI, построение объекта и деконструкцию, механизмы и версии сериализации и т. Д. И т. Д. И т. Д. – Esko

+32

Это не так Я прочитал вопрос. Мне кажется, что его проблема заключается в том, как преобразовать объект в байт [] - а не как его отправить. –

+1

Тейлор: да, вы поняли это правильно. Я хочу превратить объект в байт [] и передать его. можете ли вы также указать код о том, как включить этот байт [] в объект? – iTEgg

233

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

И больше способов упоминается here

Кроме того, вся коллекция может быть импортирован. См this link

+49

Добавлено накладные расходы? В этот момент также можно восстановить колесо. Серьезно, гораздо проще понять этот однострочный лайнер и уменьшить возможные ошибки (например, не закрывать поток в нужное время и еще много чего). – ALOToverflow

+0

Это просто и просто, в отличие от 99% других ответов на этот точный вопрос. –

+0

Я использовал ваш ответ, uris и не могу понять, почему я получаю «java.io.StreamCorruptedException: недопустимый заголовок потока: 3C3F786D»? –

59

Если вы используете 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(); 
    } 
} 
2

Может быть сделано 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 файл и вы сделали.

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