В Java мы можем сериализовать объект в String разными способами, и каждый метод имеет свою важность и вариант использования. Сериализованные строки гораздо проще отправлять(и отлаживать) по сети, чем байтовые массивы.
Из нескольких подходов мы перечислим три наиболее распространенных:
Механизм | Обсуждение |
---|---|
Сериализовать объект в Byte[], а затем закодировать byte[] в String | – Объект Java должен реализовывать интерфейс Serializable. – Никакой внешней зависимости не требуется. |
Сериализовать объект в XML или JSON. При желании можно закодировать XML или JSON. | – Реализация интерфейса Serializable необязательна. – Необходима внешняя зависимость( Jackson или Gson ). – Кодирование/декодирование Base64 необязательно. |
1. Сериализация объекта в строку, закодированную в Base64
В механизме сериализации по умолчанию в Java мы можем сериализовать Object в Byte[], если Object реализует интерфейс Serializable. Сериализация/десериализация осуществляется через классы java.io.ObjectOutputStream и java.io.ObjectInputStream и методы writeObject()/readObject().
В следующем примере мы создали служебные методы для процесса сериализации и десериализации:
public class SerializationUtils {public static String objectToString(Serializable obj) throws IOException {try(ByteArrayOutputStream baos = new ByteArrayOutputStream();ObjectOutputStream ois = new ObjectOutputStream(baos)) {ois.writeObject(obj);return Base64.getEncoder().encodeToString(baos.toByteArray());}}public static Object stringToObject(String obj) throws IOException, ClassNotFoundException {byte[] data = Base64.getDecoder().decode(obj);try(ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(data))) {return ois.readObject();}}}
Мы можем использовать вспомогательный метод objectToString() для преобразования объекта в строку, закодированную по Base46, и метод stringToObject() для преобразования строки, закодированной по Base64, в объект Java следующим образом:
Person person = new Person(1, "Lokesh");String encodedString = SerializationUtils.objectToString(person);System.out.println(encodedString);Person deserializedPerson =(Person) SerializationUtils.stringToObject(encodedString);System.out.println(deserializedPerson);
Вывод программы:
rO0ABXNyAENjb20uaG93dG9kb2luamF2YS5jb3JlLnNlcmlh....Person[id=1, name=Lokesh]
Обратите внимание, что закодированная строка может быть довольно длинной, поскольку она содержит различную метаинформацию о сериализованном объекте.
Если нас интересуют небольшие строки(из-за ограничений памяти), мы можем сначала сериализовать объект в JSON или XML.
2. Сериализация объекта в JSON или XML
Другой хороший способ сериализации объекта в String — это преобразование его в JSON или XML-представление. Одним из больших преимуществ этого подхода является то, что классу Java не нужно реализовывать интерфейс Serializable. Это особенно полезно, если класс является частью устаревшего исходного кода и сторонней библиотеки, и мы не можем изменить исходный код.
ObjectMapper mapper = new ObjectMapper();String json = mapper.writeValueAsString(person);System.out.println(json);String deserializedPerson = mapper.readValue(json, Person.class);System.out.println(deserializedPerson);
Вывод программы:
{"id":1,"name":"Lokesh"}Person[id=1, name=Lokesh]
Для преобразования в XML-представление используйте класс XmlMapper вместо ObjectMapper. Все остальное остается прежним.
XmlMapper xmlMapper = new XmlMapper();String xml = xmlMapper.writeValueAsString(person);System.out.println(xml);String deserializedPerson = xmlMapper.readValue(xml, Person.class);System.out.println(deserializedPerson);
Вывод программы:
<Person><id>1</id><name>Lokesh</name></Person>Person[id=1, name=Lokesh]
Независимо от строк JSON или XML, если нам требуется строка в кодировке Base64, мы все равно можем применить методы кодирования и декодирования к этим строкам. Сгенерированные кодированные строки также будут намного меньше, поскольку они не содержат также метаданных объекта.
ObjectMapper mapper = new ObjectMapper();String json = mapper.writeValueAsString(person);String base64EncodedString = Base64.getEncoder().encodeToString(json.getBytes());System.out.println(base64EncodedString);String decodedJson = new String(Base64.getDecoder().decode(base64EncodedString));deserializedPerson = mapper.readValue(decodedJson, Person.class);System.out.println(deserializedPerson);
Вывод программы:
eyJpZCI6MSwibmFtZSI6Ikxva2VzaCJ9Person[id=1, name=Lokesh]
3. Резюме
В этом кратком руководстве по Java мы научились преобразовывать объект Java в строковое представление, сначала преобразуя объект в byte[], а затем в его XML/JSON-представление. Мы также научились сериализовать и десериализовать строки в/из значений, закодированных в Base64.