首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Merlin 長期持久化:XMLEncoder/XMLDecoder 實現 JavaBean 狀態 XML 序列化

     編輯:Java 相關知識

動機:序列化的局限

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 格式分析

輸出 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,請參考文檔格式規範。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved