目次


XStream を使って Java オブジェクトを XML にシリアライズする

XStream を使ってオブジェクトの永続化、構成、そしてデータ・トランスポートを容易に行う

Comments

XStream を利用すると、何もマッピングを行わなくても大部分の Java オブジェクトをシリアライズすることができます。オブジェクトの名前は生成される XML の中の要素の名前になり、またクラスの中のストリングによって XML の要素の内容が構成されます。XStream によってシリアライズされるクラスは Serializable インターフェースを実装する必要がありません。XStream はシリアライズ・ツールであり、データ・バインディング・ツールではありません。これはつまり、XStream は XML ファイルまたは XSD (XML Schema Definition) ファイルからのクラス生成は行わないということです。

XStream が他のシリアライズ・ツールと比べて大きく異なる点として、次の 3 つの特徴を挙げることができます。

  1. XStream では、シリアライズ/デシリアライズされるクラスのフィールドの可視性の影響はありません。
  2. シリアライズ/デシリアライズされるクラスのフィールドに対するセッター・メソッドやゲッター・メソッドは必要ありません。
  3. シリアライズ/デシリアライズされるクラスはデフォルトのコンストラクターを持つ必要はありません。

XStream を使うと、サードパーティーの任意のクラスを、クラスに手を加えることなく直接シリアライズ/デシリアライズすることができます。

開発環境をセットアップする

XStream をダウンロードしてインストールするためには以下のステップに従います (「参考文献」にダウンロードのためのリンクがあります。)

  1. Eclipse の Web サイトから Eclipse をダウンロードします。Eclipse をインストールするためには、ダウンロードした Eclipse を任意のフォルダーに解凍します。この記事ではこのフォルダーを eclipse_home と呼ぶことにします。また使用する Eclipse のバージョンは、3.3 を前提としています。
  2. XStream の Web サイトから最新の安定したバージョンの XStream をダウンロードします。XStream をインストールするためには、ダウンロードした Xstream を任意のフォルダーに解凍します。この記事ではこのフォルダーを xstream_home と呼ぶことにします。また使用する XStream のバージョンは、1.2.2 を前提としています。
  3. Sun の Web サイトから J2SE (Java Platform, Standard Edition) の SDK (software development kit) をダウンロードします。これを任意のフォルダーにインストールします。この記事ではこのフォルダーを java_home と呼ぶことにします。また使用する SDK のバージョンは、1.5.0_05 を前提としています。

Java プロジェクトを作成する

Java プロジェクトを作成するためには、File > New > Project の順に進み、そして以下のステップに従います。

  1. Java > Java Project > Next の順に進みます (図 1)。
    図 1. 新しい Java プロジェクトを開始する
    新しい Java プロジェクトを開始する
    新しい Java プロジェクトを開始する
  2. Project name にプロジェクト名を入力し、Next をクリックします (図 2)。
    図 2. プロジェクト名を入力する
    プロジェクト名を入力する
    プロジェクト名を入力する
  3. Finish をクリックして作業を完了します (図 3)。
    図 3. セットアップを完了する
    セットアップを完了する
    セットアップを完了する

図 4 は、Java プロジェクトを作成した結果を示しています。

図 4. 新しい Java プロジェクト
新しい Java プロジェクト

XStream のサポートを追加する

今作成したプロジェクトに XStream のライブラリーを追加するためには、以下のステップに従います。

  1. このプロジェクトを Eclipse の Project Explorer の中で選択し、Project メニューに進み、Properties を選択します (図 5)。
    図 5. XStream のライブラリーを追加する
    XStream のライブラリーを追加する
    XStream のライブラリーを追加する
  2. Add External JARs をクリックし、xstream_home/lib フォルダーから xstream-1.2.2.jar を選択します。
  3. OK をクリックして作業を完了します (図 6)。
    図 6. XStream のサポートを完了する
    XStream のサポートを完了する
    XStream のサポートを完了する

図 7 は、このプロジェクトに XStream のサポートを追加した結果を示しています。

図 7. 追加されたライブラリー
追加されたライブラリー

オブジェクトをシリアライズする

この簡単な例では、XStream を使ってオブジェクトをシリアライズ/デシリアライズする方法を説明します。この例には WriterReader という 2 つのクラスがあります。Writer クラスは XStream の API を使って Employee 型のオブジェクトを XML にシリアライズし、その XML をファイルシステムのファイルの中に保存します (リスト 1)。

リスト 1. Writer.java
package com.samples;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import com.thoughtworks.xstream.*;

public class Writer {

    public static void main(String[] args) {
        Employee e = new Employee();

        //Set the properties using the setter methods
        //Note: This can also be done with a constructor.
        //Since we want to show that XStream can serialize
        //even without a constructor, this approach is used.
        e.setName("Jack");
        e.setDesignation("Manager");
        e.setDepartment("Finance");

        //Serialize the object
        XStream xs = new XStream();

        //Write to a file in the file system
        try {
            FileOutputStream fs = new FileOutputStream("c:/temp/employeedata.txt");
            xs.toXML(e, fs);
        } catch (FileNotFoundException e1) {
            e1.printStackTrace();
        }
    }
}

Reader クラスはこのファイルを読み取り、XML をデシリアライズし、そしてそのデータを Java オブジェクトの中に入れます (リスト 2)。

リスト 2. Reader.java
package com.samples;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import com.thoughtworks.xstream.*;
import com.thoughtworks.xstream.io.xml.DomDriver;

public class Reader {

    public static void main(String[] args) {
        XStream xs = new XStream(new DomDriver());
        Employee e = new Employee();

        try {
            FileInputStream fis = new FileInputStream("c:/temp/employeedata.txt");
            xs.fromXML(fis, e);

            //print the data from the object that has been read
            System.out.println(e.toString());

        } catch (FileNotFoundException ex) {
            ex.printStackTrace();
        }

    }
}

リスト 3Employee オブジェクトの構造を示しています。

リスト 3. Employee.java
package com.samples;

public class Employee {
    private String name;
    private String designation;
    private String department;

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getDesignation() {
        return designation;
    }
    public void setDesignation(String designation) {
        this.designation = designation;
    }
    public String getDepartment() {
        return department;
    }
    public void setDepartment(String department) {
        this.department = department;
    }
    @Override
    public String toString() {
        return "Name : "+this.name+
        "\nDesignation : "+this.designation+
        "\nDepartment : "+this.department;
    }
}

構成ファイルを読み取る

大部分のアプリケーションは、いくつかのプロパティーに依存しています。これらのプロパティーは、接続先のデータ・ソースの名前のこともあれば、ログ・ファイルの場所のこともあります。こうしたデータを保存する上で最適な場所は構成ファイルです。構成ファイルに保存することによって、アプリケーションを再コンパイルせずにこれらのプロパティーを変更することができ、またアプリケーションの保守も容易になるからです。このサンプル・シナリオでは、アプリケーションの中で XStream を使うことによって XML 構成ファイルから構成プロパティーを読み取る方法を説明します。

典型的な XML のデータ・バインディングでは、XML ファイルから Java オブジェクトを生成する必要があります。XStream の場合には、オブジェクトを生成するフェーズがありません。単に Java クラスを作成し、そのクラスのフィールドを読み取り対象の XML 要素にマッピングするだけです。この例では、リスト 4 に示す構成ファイルを想定しています。

リスト 4. Config.xml
<?xml version="1.0" encoding="UTF-8"?>
<config>
    <datasource-name>IRIS</datasource-name>
    <ipaddress>9.124.74.85</ipaddress>
    <logfilename>DailyLogApplication.log</logfilename>
    <appender>console</appender>
</config>

リスト 5ConfigReader クラスのコードを示しています。このクラスは構成ファイルを読み取り、その読み取ったプロパティーを Java オブジェクトの中にロードします。

リスト 5. ConfigReader.java
package com.samples;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import com.thoughtworks.xstream.*;
import com.thoughtworks.xstream.io.xml.DomDriver;

public class ConfigReader {

    String datasourcename = null;
    String ipaddress = null;
    String logfilename = null;
    String appender = null;

    @Override
    public String toString() {
        // This method prints out the values stored in the member variables
        return "Datasource Name : "+datasourcename+
            " \nIP Address : "+ipaddress+
            " \nLogfilename : "+logfilename+
            " \nAppender : "+appender;
    }

    /**
     * @param args
     * @throws FileNotFoundException 
     */
    public static void main(String[] args) throws FileNotFoundException {
        XStream xs = new XStream(new DomDriver());

        FileInputStream fis = new FileInputStream("c:/temp/Config.xml");
        xs.aliasField("datasource-name", ConfigReader.class, "datasourcename");
        xs.alias("config", ConfigReader.class);
        ConfigReader r = (ConfigReader)xs.fromXML(fis);

        System.out.println(r.toString());
    }
}

まとめ

XStream を使ったアプリケーションのセットアップと開発は、簡単な数ステップで行うことができます。これで、XStream を使って Java オブジェクトをシリアライズ/デシリアライズする方法と構成ファイルを読み取る方法について理解できたので、今度はエイリアスやアノテーション、コンバーターなどについて XStream のサイトで学ぶことができます (「参考文献」にチュートリアルへのリンクがあります)。エイリアスとコンバーターを利用すると、生成される XML を完全に制御することができます。


ダウンロード可能なリソース


関連トピック

  • XStream を学ぶための出発点として、XStream を簡単に紹介した Two Minute Tutorial があります。これを読むことによって、オブジェクトから XML への変換、またその逆変換がいかに簡単かの感覚をつかむことができます。
  • XStream の Tweaking the Output ページには、XStream からの出力の調整方法についての追加情報があります。
  • 上級のユーザーは Converter Tutorial を読むことで、生成され、読み取られる XML を完全にコントロールできるようになります。
  • Practical data binding: Get your feet wet in the real world」(Brett McLaughlin 著、developerWorks、2004年5月) を読み、データ・バインディングについて学んでください。
  • JavaにおけるXML: データ・バインディング 第1回: コード生成方式 -- JAXBなどなど」(Dennis Sosnoski 著、developerWorks、2003年1月) も、XML のデータ・バインディングのための方法を、さらにいくつか解説しています。
  • XML および関連技術において IBM 認証開発者になる方法については、IBM XML certification を参照してください。
  • developerWorks の XML ゾーンは XML の技術ライブラリーとして、広範な話題を網羅した技術記事やヒント、チュートリアル、技術標準、IBM レッドブックなどを用意しています。
  • Eclipse の Web サイトから Eclipse をダウンロードし、インストールしてください。
  • オブジェクトを XML にシリアライズし、またその逆を行う簡単なライブラリー、XStream を XStream の Web サイトからダウンロードしてください。
  • 皆さんの次期開発プロジェクトを IBM trial software を使って構築してください。developerWorks から直接ダウンロードすることができます。

コメント

コメントを登録するにはサインインあるいは登録してください。

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=XML, Java technology, Open source
ArticleID=307827
ArticleTitle=XStream を使って Java オブジェクトを XML にシリアライズする
publish-date=04082008