レベル: 中級 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 つの特徴を挙げることができます。
- XStream では、シリアライズ/デシリアライズされるクラスのフィールドの可視性の影響はありません。
- シリアライズ/デシリアライズされるクラスのフィールドに対するセッター・メソッドやゲッター・メソッドは必要ありません。
- シリアライズ/デシリアライズされるクラスはデフォルトのコンストラクターを持つ必要はありません。
XStream を使うと、サードパーティーの任意のクラスを、クラスに手を加えることなく直接シリアライズ/デシリアライズすることができます。
開発環境をセットアップする
XStream をダウンロードしてインストールするためには以下のステップに従います (「参考文献」にダウンロードのためのリンクがあります。)
- Eclipse の Web サイトから Eclipse をダウンロードします。Eclipse をインストールするためには、ダウンロードした Eclipse を任意のフォルダーに解凍します。この記事ではこのフォルダーを eclipse_home と呼ぶことにします。また使用する Eclipse のバージョンは、3.3 を前提としています。
- XStream の Web サイトから最新の安定したバージョンの XStream をダウンロードします。XStream をインストールするためには、ダウンロードした Xstream を任意のフォルダーに解凍します。この記事ではこのフォルダーを xstream_home と呼ぶことにします。また使用する XStream のバージョンは、1.2.2 を前提としています。
- Sun の Web サイトから J2SE (Java Platform, Standard Edition) の SDK (software development kit) をダウンロードします。これを任意のフォルダーにインストールします。この記事ではこのフォルダーを java_home と呼ぶことにします。また使用する SDK のバージョンは、1.5.0_05 を前提としています。
Java プロジェクトを作成する
Java プロジェクトを作成するためには、File > New > Project の順に進み、そして以下のステップに従います。
-
Java > Java Project > Next の順に進みます (図 1)。
図 1. 新しい Java プロジェクトを開始する
- Project name にプロジェクト名を入力し、Next をクリックします (図 2)。
図 2. プロジェクト名を入力する
-
Finish をクリックして作業を完了します (図 3)。
図 3. セットアップを完了する
図 4 は、Java プロジェクトを作成した結果を示しています。
図 4. 新しい Java プロジェクト
XStream のサポートを追加する
今作成したプロジェクトに XStream のライブラリーを追加するためには、以下のステップに従います。
- このプロジェクトを Eclipse の Project Explorer の中で選択し、Project メニューに進み、Properties を選択します (図 5)。
図 5. XStream のライブラリーを追加する
-
Add External JARs をクリックし、xstream_home/lib フォルダーから xstream-1.2.2.jar を選択します。
-
OK をクリックして作業を完了します (図 6)。
図 6. XStream のサポートを完了する
図 7 は、このプロジェクトに XStream のサポートを追加した結果を示しています。
図 7. 追加されたライブラリー
オブジェクトをシリアライズする
この簡単な例では、XStream を使ってオブジェクトをシリアライズ/デシリアライズする方法を説明します。この例には Writer と Reader という 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();
}
}
}
|
リスト 3 は Employee オブジェクトの構造を示しています。
リスト 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>
|
リスト 5 は ConfigReader クラスのコードを示しています。このクラスは構成ファイルを読み取り、その読み取ったプロパティーを 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 article | x-xstreamcode.zip | 3KB | HTTP |
|---|
参考文献 学ぶために
製品や技術を入手するために
-
Eclipse の Web サイトから Eclipse をダウンロードし、インストールしてください。
- オブジェクトを XML にシリアライズし、またその逆を行う簡単なライブラリー、XStream を XStream の Web サイトからダウンロードしてください。
- 皆さんの次期開発プロジェクトを IBM trial software を使って構築してください。developerWorks から直接ダウンロードすることができます。
議論するために
著者について  | 
|  |
Rajiv Bangalore は IBM India の Senior Staff Software Engineer です。彼はこれまで 7 年間にわたる経歴の中で、さまざまな Java EE (Java Platform, Enterprise Edition) 開発プロジェクトに参加してきています。彼の連絡先は rajiv.bangalore@in.ibm.com です。 |
記事の評価
|