Класс XMLEncoder
- java.lang.Object
-
- java.beans.Encoder
-
- java.beans.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 обрабатывается специально и записывается <string>Привет, мир</string>, где символы строки преобразуются в байты с использованием кодировки символов UTF-8.
Хотя все графы объектов могут быть записаны с помощью только этих трех тегов, следующие определения включены для того, чтобы общие структуры данных могли быть выражены более лаконично:
- Имя метода по умолчанию — "new".
- Ссылка на класс Java записывается в виде <class>javax.swing.JButton</class>.
- Экземпляры обертывающих классов для примитивных типов Java записываются с использованием имени примитивного типа в качестве тега. Например, экземпляр класса
Integerможет быть записан: <int>123</int>. Обратите внимание, что классXMLEncoderиспользует пакет Java reflection, в котором преобразование между примитивными типами Java и их связанными «оберточными классами» обрабатывается внутри. API самого классаXMLEncoderоперирует только сObject. - В элементе, представляющем нульарный метод, имя которого начинается с "get", атрибут "method" заменяется на атрибут "property", значение которого получается путем удаления префикса "get" и приведения результата к нижнему регистру.
- В элементе, представляющем одноаргументный метод, имя которого начинается с "set", атрибут "method" заменяется на атрибут "property", значение которого получается путем удаления префикса "set" и приведения результата к нижнему регистру.
- В элементе, представляющем метод с именем "get", принимающий один целочисленный аргумент, атрибут "method" заменяется на атрибут "index", значение которого равно значению первого аргумента.
- В элементе, представляющем метод с именем "set", принимающий два аргумента, первый из которых — целое число, атрибут "method" заменяется на атрибут "index", значение которого равно значению первого аргумента.
- Ссылка на массив записывается с использованием тега "array". Атрибуты "class" и "length" соответственно указывают подтип массива и его длину.
Для получения дополнительной информации можно ознакомиться со статьей Использование XMLEncoder в The Swing Connection.
- С момента:
- 1.4
- См. также:
-
XMLDecoder,ObjectOutputStream
Конструкторы
| Конструктор | Описание |
|---|---|
XMLEncoder(OutputStream out) | Создаёт новый XML-кодировщик для записи JavaBean в поток |
XMLEncoder(OutputStream out,
String charset,
boolean declaration,
int indentation) | Создаёт новый XML-кодировщик для записи JavaBean в поток |
Методы
| Модификатор и тип | Метод | Описание |
|---|---|---|
void | close() | Этот метод вызывает |
void | flush() | Этот метод записывает преамбулу, связанную с XML-кодировкой, если она ещё не была записана, и затем записывает все значения, записанные в поток с момента последнего вызова |
Object | getOwner() | Возвращает владельца данного кодировщика. |
void | setOwner(Object owner) | Устанавливает владельца данного кодировщика в |
void | writeExpression(Expression oldExp) | Записывает выражение, чтобы кодировщик произвёл фактический вывод при сбросе потока. |
void | writeObject(Object o) | Записывает XML-представление указанного объекта в выходной поток. |
void | writeStatement(Statement oldStm) | Записывает выражение, чтобы кодировщик произвёл фактический вывод при сбросе потока. |
Методы, объявленные в классе java.beans.Encoder
get, getExceptionListener, getPersistenceDelegate, remove, setExceptionListener, setPersistenceDelegate Методы, объявленные в классе java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait Конструкторы
XMLEncoder
public XMLEncoder(OutputStream out)
Создаёт новый кодировщик XML для записи JavaBeans в поток out с использованием кодировки XML.
- Параметры:
-
out- поток, в который будет записано XML-представление объектов - Исключения:
-
IllegalArgumentException- еслиoutявляетсяnull - См. также:
XMLDecoder(InputStream)
XMLEncoder
public XMLEncoder(OutputStream out,
String charset,
boolean declaration,
int indentation) Создаёт новый кодировщик XML для записи JavaBeans в поток out с использованием заданной charset, начиная с заданного indentation.
- Параметры:
-
out- поток, в который будет записано XML-представление объектов -
charset- имя запрошенной кодировки символов; может быть либо каноническим именем, либо псевдонимом -
declaration- нужно ли генерировать объявление XML; установите это значение вfalseпри встраивании содержимого в другой XML-документ -
indentation- количество пробельных символов для отступа всего XML-документа - Исключения:
-
IllegalArgumentException- еслиoutилиcharsetявляетсяnull, или еслиindentationменьше 0 -
IllegalCharsetNameException- если имя кодировки некорректно -
UnsupportedCharsetException- если в данной инстанции виртуальной машины Java нет поддержки указанной кодировки -
UnsupportedOperationException- если загруженная кодировка не поддерживает кодирование - С:
- 1.7
- См. также:
Charset.forName(String)
Методы
setOwner
public void setOwner(Object owner)
Устанавливает владельца этого кодировщика в owner.
- Параметры:
-
owner- Владелец этого кодировщика. - См. также:
getOwner()
getOwner
public Object getOwner()
Получает владельца этого кодировщика.
- Возвращает:
- Владелец этого кодировщика.
- См. также:
setOwner(java.lang.Object)
writeObject
public void writeObject(Object o)
Записывает XML-представление указанного объекта в выходной поток.
- Переопределяет:
-
writeObjectв классеEncoder - Параметры:
-
o- Объект, который нужно записать в поток. - См. также:
XMLDecoder.readObject()
writeStatement
public void writeStatement(Statement oldStm)
Записывает объект Statement, чтобы кодировщик произвел фактический вывод при сбросе потока.
Этот метод должен вызываться только в контексте инициализации делегата персистентности.
- Переопределяет:
-
writeStatementв классеEncoder - Параметры:
-
oldStm- Оператор, который будет записан в поток. - См. также:
PersistenceDelegate.initialize(java.lang.Class<?>, java.lang.Object, java.lang.Object, java.beans.Encoder)
writeExpression
public void writeExpression(Expression oldExp)
Записывает объект Expression, чтобы кодировщик произвел фактический вывод при сбросе потока.
Этот метод должен вызываться только в контексте инициализации делегата персистентности или настройки кодировщика для чтения из ресурсного набора.
Дополнительная информация об использовании ресурсных наборов с XMLEncoder находится по адресу Создание интернационализированных приложений,
- Переопределяет:
-
writeExpressionв классеEncoder - Параметры:
-
oldExp- Выражение, которое будет записано в поток. - См. также:
PersistenceDelegate.initialize(java.lang.Class<?>, java.lang.Object, java.lang.Object, java.beans.Encoder)
flush
public void flush()
Этот метод записывает преамбулу, связанную с кодировкой XML, если она ещё не была записана, а затем записывает все значения, которые были записаны в поток с последнего вызова flush. После сброса все внутренние ссылки на значения, которые были записаны в этот поток, очищаются.
close
public void close()
Этот метод вызывает flush, записывает заключительную постскрипцию и затем закрывает выходной поток, связанный с этим потоком.
- Определено в:
-
closeв интерфейсеAutoCloseable
© 1993, 2020, 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/11/docs/api/java.desktop/java/beans/XMLEncoder.html