IBM®
本文へジャンプ
    Japan [変更]    ご利用条件
 
 
検索範囲検索:    
    ホーム    製品    サービス & ソリューション    サポート & ダウンロード    マイアカウント    
skip to main content

developerWorks Japan  >  XML | Java technology | Open source  >

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

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

developerWorks
ページオプション

JavaScript を要するドキュメントオプションは表示されません

サンプルコード

原文はこちら

原文はこちら


レベル: 中級

Rajiv Bangalore (rajiv.bangalore@in.ibm.com), Senior Staff Software Engineer, IBM India Private Ltd.

2008年 4月 08日

XML にシリアライズしたデータには、オブジェクトの永続化やデータ・トランスポートなど、無数の使い方があります。しかし一部の XML シリアライズ技術は実装が複雑です。XStream は Java オブジェクトを XML にシリアライズし、またその逆の操作を行うための、軽量で使いやすいオープンソースの Java™ ライブラリーです。XStream のセットアップ方法を学び、また XStream を使ってオブジェクトをシリアライズ/デシリアライズする方法、そして XML 構成ファイルから構成プロパティーを読み取る方法を理解しましょう。

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 プロジェクトを開始する


  2. Project name にプロジェクト名を入力し、Next をクリックします (図 2)。

    図 2. プロジェクト名を入力する


  3. Finish をクリックして作業を完了します (図 3)。

    図 3. セットアップを完了する


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


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

XStream のサポートを追加する

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

  1. このプロジェクトを Eclipse の Project Explorer の中で選択し、Project メニューに進み、Properties を選択します (図 5)。

    図 5. XStream のライブラリーを追加する


  2. Add External JARs をクリックし、xstream_home/lib フォルダーから xstream-1.2.2.jar を選択します。
  3. OK をクリックして作業を完了します (図 6)。

    図 6. 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;
    }
}




上に戻る


構成ファイルを読み取る

複雑な XML ファイルを読み取る

この構成の例では、簡単な XML ファイルを読み取る方法を説明しています。複雑な XML ファイルを読み取るためにはカスタムのコンバーターを作成する必要があるかもしれません。コンバーターを作成する方法についてのチュートリアルは、XStream の「Converter Tutorial」のサイトに用意されています。

大部分のアプリケーションは、いくつかのプロパティーに依存しています。これらのプロパティーは、接続先のデータ・ソースの名前のこともあれば、ログ・ファイルの場所のこともあります。こうしたデータを保存する上で最適な場所は構成ファイルです。構成ファイルに保存することによって、アプリケーションを再コンパイルせずにこれらのプロパティーを変更することができ、またアプリケーションの保守も容易になるからです。このサンプル・シナリオでは、アプリケーションの中で 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 を完全に制御することができます。





上に戻る


ダウンロード

内容ファイル名サイズダウンロード形式
Java source code from this articlex-xstreamcode.zip3KBHTTP
ダウンロード形式について


参考文献

学ぶために
  • 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 ゾーンに用意された、XML に関する最新リソースの中心、New to XML を調べてみてください。

  • XML および関連技術において IBM 認証開発者になる方法については、IBM XML certification を参照してください。

  • developerWorks の XML ゾーンは XML の技術ライブラリーとして、広範な話題を網羅した技術記事やヒント、チュートリアル、技術標準、IBM レッドブックなどを用意しています。

  • developerWorks technical events and webcasts で最新情報を入手してください。

  • テクノロジー・ブックストアには、この記事や他の技術的な話題に関する本が豊富に取り揃えられています。

  • Podcasts で IBM の技術エキスパートに追いついてください。


製品や技術を入手するために
  • Eclipse の Web サイトから Eclipse をダウンロードし、インストールしてください。

  • オブジェクトを XML にシリアライズし、またその逆を行う簡単なライブラリー、XStream を XStream の Web サイトからダウンロードしてください。

  • 皆さんの次期開発プロジェクトを IBM trial software を使って構築してください。developerWorks から直接ダウンロードすることができます。


議論するために


著者について

Photo of Rajiv Bangalore

Rajiv Bangalore は IBM India の Senior Staff Software Engineer です。彼はこれまで 7 年間にわたる経歴の中で、さまざまな Java EE (Java Platform, Enterprise Edition) 開発プロジェクトに参加してきています。彼の連絡先は rajiv.bangalore@in.ibm.com です。




記事の評価


サイト改善のため、ご意見をお寄せください。こちらのフォームからお願いいたします。



 


 


不充分・不完全である大変素晴らしい
 


この記事を共有する

はてなブックマーク はてなブックマーク livedoorクリップ livedoorクリップ del.icio.us del.icio.us Buzzurl(バザール) Buzzurl(バザール) Choix! Choix!
Saafブックマーク Saafブックマーク FC2ブックマーク FC2ブックマーク MM/memo MM/memo ニフティクリップ ニフティクリップ Yahoo!ブックマーク Yahoo!ブックマーク
CZブックマーク CZブックマーク newsing newsing




上に戻る


    日本IBMについて プライバシー お問い合わせ