Класс XMLEncoder
- Все реализуемые интерфейсы:
AutoCloseable
public class XMLEncoder extends Encoder implements AutoCloseable
XMLEncoder является дополнительной альтернативой ObjectOutputStream и может использоваться для создания текстового представления JavaBean так же, как ObjectOutputStream можно использовать для создания двоичного представления объектов Serializable. Например, следующий фрагмент можно использовать для создания текстового представления предоставленного JavaBean и всех его свойств:
XMLEncoder e = new XMLEncoder(
new BufferedOutputStream(
new FileOutputStream("Test.xml")));
e.writeObject(new JButton("Hello, world"));
e.close();
Несмотря на сходство их API, класс XMLEncoder предназначен исключительно для архивирования графов JavaBean в виде текстовых представлений их открытых свойств. Подобно исходным файлам Java, документы, записанные таким образом, обладают естественной устойчивостью к изменениям реализаций задействованных классов. Для межпроцессного взаимодействия и сериализации общего назначения по-прежнему рекомендуется использовать ObjectOutputStream. Класс XMLEncoder задаёт представление JavaBean по умолчанию: они представлены в виде XML-документов, соответствующих версии 1.0 спецификации XML и использующих кодировку символов UTF-8 набора символов Unicode/ISO 10646. XML-документы, создаваемые классом XMLEncoder:
- Переносимы и устойчивы к версиям: они не зависят от закрытой реализации какого-либо класса и поэтому, подобно исходным файлам Java, могут обмениваться между средами с разными версиями некоторых классов и между виртуальными машинами разных поставщиков.
- Компактны по структуре: класс
XMLEncoderиспользует внутренний алгоритм устранения избыточности, поэтому значения свойств компонента Bean по умолчанию не записываются в поток. - Устойчивы к ошибкам: неструктурные ошибки в файле, вызванные повреждением файла или изменениями API классов в архиве, остаются локализованными, поэтому считыватель может сообщить об ошибке и продолжить загрузку частей документа, которые она не затронула.
Ниже приведён пример XML-архива, содержащего некоторые компоненты пользовательского интерфейса из набора инструментов swing:
<?xml version="1.0" encoding="UTF-8"?>
<java version="1.0" class="java.beans.XMLDecoder">
<object class="javax.swing.JFrame">
<void property="name">
<string>frame1</string>
</void>
<void property="bounds">
<object class="java.awt.Rectangle">
<int>0</int>
<int>0</int>
<int>200</int>
<int>200</int>
</object>
</void>
<void property="contentPane">
<void method="add">
<object class="javax.swing.JButton">
<void property="label">
<string>Hello</string>
</void>
</object>
</void>
</void>
<void property="visible">
<boolean>true</boolean>
</void>
</object>
</java>
В синтаксисе XML используются следующие соглашения: - Каждый элемент представляет собой вызов метода.
- Тег "object" обозначает выражение, значение которого используется в качестве аргумента охватывающего его элемента.
- Тег "void" обозначает оператор, который будет выполнен, но результат которого не будет использоваться в качестве аргумента охватывающего его метода.
- Элементы, содержащие другие элементы, используют их как аргументы, если только у них нет тега "void".
- Имя метода указывается атрибутом "method".
- Стандартные атрибуты XML "id" и "idref" используются для ссылок на предыдущие выражения — это позволяет обрабатывать циклические зависимости в графе объектов.
- Атрибут "class" используется для явного указания целевого класса статического метода или конструктора; его значением является полное имя класса.
- Элементы с тегом "void" выполняются в контексте внешнего элемента, если целевой объект не задан атрибутом "class".
- Строковый класс Java обрабатывается особым образом и записывается как <string>Hello, world</string>, где символы строки преобразуются в байты с использованием кодировки UTF-8.
Хотя все графы объектов можно записать, используя только эти три тега, ниже приведены определения, позволяющие более компактно представлять распространённые структуры данных:
- Имя метода по умолчанию — "new".
- Ссылка на класс Java записывается в форме <class>javax.swing.JButton</class>.
- Экземпляры классов-обёрток для примитивных типов Java записываются с использованием имени примитивного типа в качестве тега. Например, экземпляр класса
Integerможно записать так: <int>123</int>. Обратите внимание, что классXMLEncoderиспользует пакет рефлексии Java, в котором преобразование между примитивными типами Java и соответствующими им «классами-обёртками» выполняется автоматически. API самого классаXMLEncoderработает только сObjectами. - В элементе, представляющем метод без аргументов, имя которого начинается с "get", атрибут "method" заменяется атрибутом "property", значение которого получается удалением префикса "get" и преобразованием первой буквы оставшейся части в строчную.
- В элементе, представляющем метод с одним аргументом, имя которого начинается с "set", атрибут "method" заменяется атрибутом "property", значение которого получается удалением префикса "set" и преобразованием первой буквы оставшейся части в строчную.
- В элементе, представляющем метод с именем "get" и одним целочисленным аргументом, атрибут "method" заменяется атрибутом "index", значением которого является значение первого аргумента.
- В элементе, представляющем метод с именем "set" и двумя аргументами, первый из которых является целым числом, атрибут "method" заменяется атрибутом "index", значением которого является значение первого аргумента.
- Ссылка на массив записывается с использованием тега "array". Атрибуты "class" и "length" задают соответственно подтип массива и его длину.
Дополнительные сведения можно найти в статье Using XMLEncoder в The Swing Connection.
- Начиная с:
- 1.4
- См. также:
Краткое описание конструкторов
| Конструктор | Описание |
|---|---|
XMLEncoder |
Создаёт новый XML-кодировщик для записи JavaBeans в поток out с использованием кодировки XML. |
XMLEncoder |
Создаёт новый XML-кодировщик для записи JavaBeans в поток out с использованием заданной charset, начиная с указанного indentation. |
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
void |
close() |
Этот метод вызывает flush, записывает завершающий фрагмент, а затем закрывает выходной поток, связанный с этим потоком. |
void |
flush() |
Этот метод записывает начальный фрагмент XML-кодировки, если он ещё не был записан, а затем записывает все значения, добавленные в поток с момента последнего вызова flush. |
Object |
getOwner() |
Возвращает владельца этого кодировщика. |
void |
setOwner |
Устанавливает owner в качестве владельца этого кодировщика. |
void |
writeExpression |
Записывает Expression, чтобы кодировщик сформировал фактический вывод при сбросе потока. |
void |
writeObject |
Записывает XML-представление указанного объекта в выходной поток. |
void |
writeStatement |
Записывает Statement, чтобы кодировщик сформировал фактический вывод при сбросе потока. |
Методы, объявленные в классе Encoder
get, getExceptionListener, getPersistenceDelegate, remove, setExceptionListener, setPersistenceDelegate
Подробное описание конструкторов
XMLEncoder
public XMLEncoder(OutputStream out)
out с использованием кодировки XML.- Параметры:
-
out— поток, в который будет записано XML-представление объектов - Исключения:
-
IllegalArgumentException— еслиoutимеет значениеnull - См. также:
XMLEncoder
public XMLEncoder(OutputStream out, String charset, boolean declaration, int indentation)
out с использованием указанной charset, начиная с указанного indentation.- Параметры:
-
out— поток, в который будет записано XML-представление объектов -
charset— имя запрошенной кодировки; может быть каноническим именем или псевдонимом -
declaration— следует ли генерировать объявление XML; задайте значениеfalse, если содержимое встраивается в другой XML-документ -
indentation— количество пробелов для отступа всего XML-документа - Исключения:
-
IllegalArgumentException— еслиoutилиcharsetимеет значениеnullлибо еслиindentationменьше 0 -
IllegalCharsetNameException— если имяcharsetнедопустимо -
UnsupportedCharsetException— если в данном экземпляре виртуальной машины Java отсутствует поддержка указанной кодировки -
UnsupportedOperationException— если загруженная кодировка не поддерживает кодирование - Начиная с:
- 1.7
- См. также:
Подробное описание методов
setOwner
public void setOwner(Object owner)
owner в качестве владельца этого кодировщика.- Параметры:
-
owner— владелец этого кодировщика. - См. также:
getOwner
public Object getOwner()
- Возвращает:
- Владелец этого кодировщика.
- См. также:
writeObject
public void writeObject(Object o)
- Переопределяет:
-
writeObjectв классеEncoder - Параметры:
-
o— объект, который будет записан в поток. - См. также:
writeStatement
public void writeStatement(Statement oldStm)
Этот метод следует вызывать только в контексте инициализации делегата сохранения.
- Переопределяет:
-
writeStatementв классеEncoder - Параметры:
-
oldStm— оператор, который будет записан в поток. - См. также:
writeExpression
public void writeExpression(Expression oldExp)
Этот метод следует вызывать только в контексте инициализации делегата сохранения или настройки кодировщика для чтения из пакета ресурсов.
Дополнительные сведения об использовании пакетов ресурсов с XMLEncoder см. в статье Создание интернационализированных приложений.
- Переопределяет:
-
writeExpressionв классеEncoder - Параметры:
-
oldExp— выражение, которое будет записано в поток. - См. также:
flush
public void flush()
flush. После сброса все внутренние ссылки на значения, записанные в этот поток, очищаются.close
public void close()
flush, записывает завершающий фрагмент, а затем закрывает выходной поток, связанный с этим потоком.- Определено в:
-
closeв интерфейсеAutoCloseable
© 1993, 2025, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
https://docs.oracle.com/en/java/javase/25/docs/api/java.desktop/java/beans/XMLEncoder.html