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 для преобразования объекта в byte[] и наоборот , как указано в ответе @uris.
чтобы преобразовать объект в байт[] путем сериализации:
byte[] data = SerializationUtils.serialize(object);для преобразования байта[] в объект путем десериализации::
Object object = (Object) SerializationUtils.deserialize(byte[] data)нажмите на ссылку скачать org-apache-commons-lang.банку
интегрировать .jar-файл, нажав:
FileName -> Открыть Настройки Медулы ->выберите модуль ->зависимости -> Добавить файл Jar и вы сделали.
надеюсь, что это помогает.
Я также рекомендую использовать SerializationUtils инструмент. Я хочу сделать ajust на неправильный комментарий @Abilash. Элемент
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();
Comments