Допустим, у меня есть сериализуемый класс AppMessage
.
Я хотел бы передать его как byte[]
через сокеты на другую машину, где он восстанавливается из полученных байтов.
Как я мог достичь этого?
java
object
serialization
iTEgg
источник
источник
byte[]
? Почему бы просто не записать это прямо в сокетObjectOutputStream
и не прочитатьObjectInputStream
?new ObjectMapper().writeValueAsBytes(JAVA_OBJECT_HERE)
Ответы:
Подготовьте байтовый массив для отправки:
Создайте объект из байтового массива:
источник
ObjectInput
,ObjectOuput
,ByteArrayOutputStream
ИByteArrayInputStream
все реализоватьAutoCloseable
интерфейс, не будет ли хорошая практика , чтобы использовать его , чтобы не пропустить их закрытия по ошибке? (Я не совсем уверен, что это лучшая практика, поэтому я интересно.) Пример:try(ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutput out = new ObjectOutputStream(bos)){ /*Do stuff*/ }catch(IOException e){/*suppress exception*/}
. Это также устраняет необходимость вfinal
пункте и его дополнительномtry-catch
.Лучший способ сделать это - использовать
SerializationUtils
Apache Commons Lang .Для сериализации:
Для десериализации:
Как уже упоминалось, для этого требуется библиотека Commons Lang. Его можно импортировать с помощью Gradle:
Maven:
Jar файл
И другие способы, упомянутые здесь
Кроме того, вся коллекция может быть импортирована. См этой ссылки
источник
Если вы используете Java> = 7, вы можете улучшить принятое решение, используя try с ресурсами :
И наоборот:
источник
Это можно сделать с помощью SerializationUtils , с помощью метода сериализации и десериализации ApacheUtils для преобразования объекта в byte [] и наоборот, как указано в ответе @uris.
Чтобы преобразовать объект в byte [] путем сериализации:
Чтобы преобразовать byte [] в объект путем десериализации ::
Нажмите на ссылку, чтобы загрузить org-apache-commons-lang.jar
Интегрируйте файл .jar, нажав:
FileName -> Открыть настройки Medule -> Выберите свой модуль -> Зависимости -> Добавить файл Jar, и все готово.
Надеюсь, это поможет .
источник
Я также рекомендую использовать инструмент SerializationUtils. Я хочу исправить неправильный комментарий @Abilash.
SerializationUtils.serialize()
Метод не ограничивается до 1024 байт, что противоречит другой ответ здесь.С первого взгляда , вы можете подумать, что
new ByteArrayOutputStream(1024)
разрешите только фиксированный размер. Но если вы внимательно посмотрите наByteArrayOutputStream
, вы поймете, что поток будет расти, если это необходимо:источник
источник
Еще один интересный метод из
com.fasterxml.jackson.databind.ObjectMapper
byte[] data = new ObjectMapper().writeValueAsBytes(JAVA_OBJECT_HERE)
Maven Dependency
источник
Spring Framework
org.springframework.util.SerializationUtils
источник
Если вы используете Spring, в Spring-Core доступен класс утилит. Вы можете просто сделать
источник
Пример кода с Java 8+:
источник
В случае, если вы хотите хорошее решение для копирования и вставки зависимостей. Возьмите код ниже.
пример
Источник
источник
Это просто оптимизированная кодовая форма принятого ответа на случай, если кто-то захочет использовать это в работе:
источник