Сериализация Java по умолчанию преобразует объекты Java в байты для отправки по сети. Но во многих случаях нам понадобится более кроссплатформенная среда для отправки этой информации, например XML, чтобы приложения, работающие на разных технологиях, также могли получить преимущество от этой сериализованной информации. В этом примере мы научимся сериализовать объекты Java в файлы XML, а затем десериализовать их обратно в исходные объекты Java.
1. Настройка
Чтобы продемонстрировать использование, мы создали класс UserSettings с 3 полями, которые мы сериализуем в XML, а затем десериализуем XML в объект Java.
public class UserSettings {private Integer fieldOne;private String fieldTwo;private boolean fieldThree;//constructors, setters, getters}
2. Сериализация POJO в XML
Давайте сначала рассмотрим пример класса XMLEncoder, который используется для сериализации или кодирования объекта Java в XML-файл.
private static void serializeToXML(UserSettings settings) throws IOException {FileOutputStream fos = new FileOutputStream("settings.xml");XMLEncoder encoder = new XMLEncoder(fos);encoder.setExceptionListener(new ExceptionListener() {public void exceptionThrown(Exception e) {System.out.println("Exception! :"+e.toString());}});encoder.writeObject(settings);encoder.close();fos.close();}
XMLEncoder использует рефлексию, чтобы узнать, какие поля они содержат, но вместо того, чтобы записывать их в двоичном виде, они записываются в XML. Объекты, которые должны быть закодированы, не должны быть Serializable, но они должны соответствовать спецификации Java Beans, например
- Объект имеет открытый пустой(без аргументов) конструктор.
- Объект имеет публичные геттеры и сеттеры для каждого защищенного/частного свойства.
Выполнение приведенного выше кода приведет к созданию XML-файла со следующим содержимым:
<?xml version="1.0" encoding="UTF-8"?><java version="1.8.0_92" class="java.beans.XMLDecoder"><object class="com.howtodoinjava.log4j2.examples.UserSettings"><void property="fieldOne"><int>10000</int></void><void property="fieldTwo"><string>HowToDoInJava.com</string></void></object></java>
Обратите внимание, что если значение по умолчанию свойства не изменилось в записываемом объекте, XmlEncoder не запишет его. Например, в нашем случае fieldThree имеет тип boolean, который имеет значение по умолчанию false – поэтому он был исключен из XML-контента. Это обеспечивает гибкость изменения значения по умолчанию между версиями класса.
3. Десериализация XML в POJO
Теперь давайте рассмотрим пример XMLDecoder, который использовался для десериализации XML-файла обратно в объект Java.
private static UserSettings deserializeFromXML() throws IOException {FileInputStream fis = new FileInputStream("settings.xml");XMLDecoder decoder = new XMLDecoder(fis);UserSettings decodedSettings =(UserSettings) decoder.readObject();decoder.close();fis.close();return decodedSettings;}
XMLEncoder и XMLDecoder гораздо более снисходительны, чем фреймворк сериализации. При декодировании, если свойство изменило свой тип или было удалено/добавлено/перемещено/переименовано, декодирование декодирует «столько, сколько может», пропуская свойства, которые оно не смогло декодировать.
4. Полный пример
Давайте рассмотрим полный пример использования XMLEncoder и XMLDecoder.
import java.beans.ExceptionListener;import java.beans.XMLDecoder;import java.beans.XMLEncoder;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;public class XMLEncoderDecoderExample{public static void main(String[] args) throws IOException{UserSettings settings = new UserSettings();settings.setFieldOne(10000);settings.setFieldTwo("HowToDoInJava.com");settings.setFieldThree(false);//BeforeSystem.out.println(settings);serializeToXML( settings );UserSettings loadedSettings = deserializeFromXML();//AfterSystem.out.println(loadedSettings);}private static void serializeToXML(UserSettings settings) throws IOException{FileOutputStream fos = new FileOutputStream("settings.xml");XMLEncoder encoder = new XMLEncoder(fos);encoder.setExceptionListener(new ExceptionListener() {public void exceptionThrown(Exception e) {System.out.println("Exception! :"+e.toString());}});encoder.writeObject(settings);encoder.close();fos.close();}private static UserSettings deserializeFromXML() throws IOException {FileInputStream fis = new FileInputStream("settings.xml");XMLDecoder decoder = new XMLDecoder(fis);UserSettings decodedSettings =(UserSettings) decoder.readObject();decoder.close();fis.close();return decodedSettings;}}
Вывод программы:
UserSettings [fieldOne=10000, fieldTwo=HowToDoInJava.com, fieldThree=false]UserSettings [fieldOne=10000, fieldTwo=HowToDoInJava.com, fieldThree=false]
Пишите мне свои вопросы в комментариях.