# 长期持久性

> 原文： [https://docs.oracle.com/javase/tutorial/javabeans/advanced/longpersistence.html](https://docs.oracle.com/javase/tutorial/javabeans/advanced/longpersistence.html)

_ 长期持久性 _ 是一种能够以 XML 格式保存 bean 的模型。

有关 XML 格式和如何实现非 bean 的长期持久性的信息可以在 [XML Schema](http://www.oracle.com/technetwork/java/persistence3-139471.html) 和 [Using XMLEncoder](http://www.oracle.com/technetwork/java/persistence4-140124.html) 中找到。

## 编码器和解码器

[`XMLEncoder`](https://docs.oracle.com/javase/8/docs/api/java/beans/XMLEncoder.html) 类被分配用于写入输出文件，用于`Serializable`对象的文本表示。以下代码片段是以 XML 格式编写 Java bean 及其属性的示例：

```
XMLEncoder encoder = new XMLEncoder(
           new BufferedOutputStream(
           new FileOutputStream("Beanarchive.xml")));

encoder.writeObject(object);
encoder.close(); 

```

[`XMLDecoder`](https://docs.oracle.com/javase/8/docs/api/java/beans/XMLDecoder.html) 类读取使用 XMLEncoder 创建的 XML 文档：

```
XMLDecoder decoder = new XMLDecoder(
    new BufferedInputStream(
    new FileInputStream("Beanarchive.xml")));

Object object = decoder.readObject();
decoder.close();

```

## 什么是 XML？

XML bean 归档文件有自己的特定语法，其中包含以下标记来表示每个 bean 元素：

*   用于描述 XML 版本和编码类型的 XML 前导码
*   a `**&lt; java&gt;** `标签用于体现 bean 的所有对象元素
*   `**&lt;对象&gt;** `标签表示从序列化形式

    ```
    &lt;object class="javax.swing.JButton" method="new"&gt;
        &lt;string&gt;Ok&lt;/string&gt;
    &lt;/object&gt;

    ```

    或语句

    ```
    &lt;object class="javax.swing.JButton"&gt;
        &lt;void method="setText"&gt;
            &lt;string&gt;Cancel&lt;/string&gt;
                &lt;/void&gt;
        &lt;/object&gt;

    ```

    重建对象所需的一组方法调用
*   用于定义适当基元类型的标签：

    ```
    &lt;int&gt;5555&lt;/int&gt;

    ```

    *   `**&lt; boolean&gt;**`
    *   `**&lt; byte&gt;**`
    *   `**&lt; char&gt;**`
    *   `**&lt;短&gt;**`
    *   `**&lt; int&gt;**`
    *   `**&lt; long&gt;**`
    *   `**&lt; float&gt;**`
    *   `**&lt; double&gt;**`
*   a **&lt; `class`&gt;** 标记表示 Class 的实例。

    ```
    &lt;class&gt;java.swing.JFrame&lt;/class&gt;

    ```

*   **&lt; HTG0 `array`&gt;** 标签定义一个数组

    ```
    &lt;array class="java.lang.String" length="5"&gt;
    &lt;/array&gt;

    ```

以下代码表示将为`SimpleBean`组件生成的 XML 存档：

```
<?xml version="1.0" encoding="UTF-8" ?>
<java>
  <object class="javax.swing.JFrame">
    <void method="add">
      <object class="java.awt.BorderLayout" field="CENTER"/>
      <object class="SimpleBean"/>
    </void>
    <void property="defaultCloseOperation">
      <object class="javax.swing.WindowConstants" field="DISPOSE_ON_CLOSE"/>
    </void>
    <void method="pack"/>
    <void property="visible">
      <boolean>true</boolean>
    </void>
  </object>
</java>

```