Java 序列化適合短期編組 (RMI/CORBA) 或 Servlet 狀態保存,但面臨類版本、運行時環境變更等問題。J2SE 1.4 引入 XMLEncoder/XMLDecoder,將 JavaBean 狀態持久化為 XML 文本文件,便於外部修改、版本演進、長期存儲。
定義含四屬性的 Bean:整數陣列 scores、唯讀浮點數 average、字串 name、Point 對象 seat。編碼:
Sample sample = new Sample();
sample.setScores(new int[]{100,90,75});
sample.setName("Gore");
sample.setSeat(new Point(5,3));
XMLEncoder encoder = new XMLEncoder(
new BufferedOutputStream(new FileOutputStream("Sample.xml")));
encoder.writeObject(sample);
encoder.close();
輸出 XML 包含版本標譽、對象類、屬性寫入操作(void property)、基本類型值(int/string)、陣列、嵌套對象。格式服從特定 DTD,解碼器能識別版本差異。
<?xml version="1.0" encoding="UTF-8"?>
<java version="1.4.0-beta" class="java.beans.XMLDecoder">
<object class="net.zukowski.ibm.Sample">
<void property="name"><string>Gore</string></void>
<void property="scores">
<array class="int" length="3">
<void index="0"><int>100</int></void>
<void index="1"><int>90</int></void>
<void index="2"><int>75</int></void>
</array>
</void>
<void property="seat">
<object class="java.awt.Point"><int>5</int><int>3</int></object>
</void>
</object>
</java>
XMLDecoder 用法類似 ObjectInputStream:
XMLDecoder decoder = new XMLDecoder(
new BufferedInputStream(new FileInputStream("Sample.xml")));
Sample sample2 = (Sample)decoder.readObject();
decoder.close();
import net.zukowski.ibm.Sample;
import java.io.*;
import java.beans.*;
import java.awt.Point;
public class SampleTest {
public static void main(String args[]) throws Exception {
Sample sample = new Sample();
sample.setScores(new int[]{100,90,75});
sample.setName("Gore");
sample.setSeat(new Point(5,3));
XMLEncoder encoder = new XMLEncoder(new BufferedOutputStream(new FileOutputStream("Sample.xml")));
encoder.writeObject(sample); encoder.close();
System.out.println(sample);
XMLDecoder decoder = new XMLDecoder(new BufferedInputStream(new FileInputStream("Sample.xml")));
Sample sample2 = (Sample)decoder.readObject(); decoder.close();
System.out.println(sample2);
}
}
後台處理複雜(如事件監聽器、容器添加組件),但使用者無需知悉細節。若需自行生成 XML,請參考文檔格式規範。