Xstream-quick-guide

提供:Dev Guides
移動先:案内検索

XStream-概要

XStreamは、JavaオブジェクトをXMLにシリアル化したり、その逆を行うためのシンプルなJavaベースのライブラリです。

特徴

  • 使いやすい-XStream APIは、一般的なユースケースを簡素化するための高レベルのファサードを提供します。
  • マッピングを作成する必要はありません-XStream APIは、シリアル化されるオブジェクトのほとんどにデフォルトのマッピングを提供します。
  • パフォーマンス-XStreamは高速で、メモリフットプリントが小さく、大きなオブジェクトのグラフまたはシステムに適しています。
  • Clean XML -XStreamは、読みやすく、クリーンでコンパクトなXML出力を生成します。
  • オブジェクトの変更は不要-XStreamはプライベートフィールドやファイナルフィールドなどの内部フィールドをシリアル化し、非パブリックおよび内部クラスをサポートします。 デフォルトのコンストラクターは必須の要件ではありません。
  • 完全なオブジェクトグラフのサポート-XStreamでは、オブジェクトモデルで発生した重複参照を維持でき、循環参照もサポートしています。
  • カスタマイズ可能な変換戦略-特定のタイプのカスタマイズをXMLとして表現できるようにするために、カスタム戦略を登録できます。
  • セキュリティフレームワーク-XStreamは、操作された入力に関するセキュリティの問題を防ぐために、非整列化された型を公平に制御します。
  • エラーメッセージ-不正なXMLが原因で例外が発生すると、問題を修正するための詳細な診断が提供されます。
  • 代替出力形式-XStreamは、JSONやモーフィングなどの他の出力形式をサポートしています。

一般的な用途

  • Transport -XMLはオブジェクトのテキスト表現であり、使用されるシリアライゼーション/デシリアライゼーションテクニックに関係なく、ワイヤを介してオブジェクトをトランスポートするために使用できます。
  • 永続性-オブジェクトはデータベース内でXMLとして永続化でき、必要に応じてマーシャリング/アンマーシャリングできます。
  • 構成-XMLは自明であり、構成の定義に頻繁に使用されます。 オブジェクトは、XML表現に変換した後、構成目的で使用することもできます。
  • ユニットテスト-XStream APIはJUnit互換であり、アプリケーションモジュールのユニットテストを強化するために使用できます。

XStream-環境設定

この章では、Javaに適した環境を設定するさまざまな側面について説明します。

ローカル環境のセットアップ

Javaプログラミング言語用に環境をセットアップする場合、このセクションでは、マシンにJavaをダウンロードしてセットアップする方法について説明します。 Java環境をセットアップするには、以下の手順に従ってください。

Java SEはリンクから無料でダウンロードできます-

Javaのダウンロード

指示に従ってJavaをダウンロードし、*。exe *を実行して、マシンにJavaをインストールします。 マシンにJavaをインストールしたら、正しいインストールディレクトリを指すように環境変数を設定する必要があります-

Windows 2000/XPのパスのセットアップ

_c:\ Program Files \ java \ jdk_ディレクトリにJavaをインストールしたと仮定します-

  • 「マイコンピュータ」を右クリックして、「プロパティ」を選択します。
  • 「詳細」タブの下の「環境変数」ボタンをクリックします。
  • 「Path」変数を変更して、Java実行可能ファイルへのパスも含まれるようにします。 たとえば、パスが現在「C:\ WINDOWS \ SYSTEM32」に設定されている場合、パスを「C:\ WINDOWS \ SYSTEM32; c:\ Program Files \ java \ jdk \ bin」に変更します。

Windows 95/98/MEのパスのセットアップ

_c:\ Program Files \ java \ jdk_ディレクトリにJavaをインストールしたと仮定します-

  • 「C:\ autoexec.bat」ファイルを編集し、最後に次の行を追加します- + 'SET PATH =%PATH%; C:\ Program Files \ java \ jdk \ bin'

Linux、UNIX、Solaris、FreeBSDのパスのセットアップ

環境変数PATHは、Javaバイナリがインストールされている場所を指すように設定する必要があります。 これがうまくいかない場合は、シェルのドキュメントを参照してください。

たとえば、シェルとして_bash_を使用する場合、 '。bashrcの最後に次の行を追加します:export PATH =/path/to/java:$ PATH'

人気のあるJavaエディター

Javaプログラムを作成するには、テキストエディターが必要です。 市場にはさらに洗練されたIDEがあります。 しかし、今のところ、次のいずれかを検討することができます-

XStream Archiveをダウンロードする

xstream-1.4.7.jarから最新バージョンのXStream jarファイルをダウンロードします。 このチュートリアルを書いている時点で、_xstream-1.4.7.jar_をダウンロードし、C:\> XStreamフォルダーにコピーしました。

OS Archive name
Windows xstream-1.4.7.jar
Linux xstream-1.4.7.jar
Mac xstream-1.4.7.jar

XStream環境を設定する

*XStream_HOME* 環境変数を設定して、マシン上のxstream jarが保存されているベースディレクトリの場所を指すようにします。 次の表に、Windows、Linux、MacでXStream環境を設定する方法を示します。XStreamフォルダーにxstream-1.4.7.jarを抽出したと仮定しています。
Sr.No. OS & Description
1

Windows

環境変数XStream_HOMEをC:\ XStreamに設定します

2

Linux

export XStream_HOME =/usr/local/XStream

3

Mac

export XStream_HOME =/Library/XStream

CLASSPATH変数を設定する

XCLASS jarの場所を指すように CLASSPATH 環境変数を設定します。 次の表は、Windows、Linux、およびMacシステムでCLASSPATH変数を設定する方法を示しています。xstream-1.4.7.jarをXStreamフォルダーに保存していることを前提としています。

Sr.No. OS & Description
1

Windows

環境変数CLASSPATHを%CLASSPATH%;%XStream_HOME%\ xstream-1.4.7.jar;に設定します。

2

Linux

export CLASSPATH = $ CLASSPATH:$ XStream_HOME/xstream-1.4.7.jar;

3

Mac

export CLASSPATH = $ CLASSPATH:$ XStream_HOME/xstream-1.4.7.jar;

XStream-最初のアプリケーション

XStreamライブラリーの詳細に入る前に、動作中のアプリケーションを見てみましょう。 この例では、StudentクラスとAddressクラスを作成しました。 学生オブジェクトを作成し、それをXML文字列にシリアル化します。 次に、同じXML文字列を逆シリアル化して、学生オブジェクトを取得します。

*C:\> XStream_WORKSPACE* にXStreamTesterという名前のJavaクラスファイルを作成します。
*_ファイル:XStreamTester.java_*
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;

import javax.xml.transform.OutputKeys;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.sax.SAXSource;
import javax.xml.transform.sax.SAXTransformerFactory;
import javax.xml.transform.stream.StreamResult;
import org.xml.sax.InputSource;

import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.StaxDriver;

public class XStreamTester {

   public static void main(String args[]) {
      XStreamTester tester = new XStreamTester();
      XStream xstream = new XStream(new StaxDriver());

      Student student = tester.getStudentDetails();

     //Object to XML Conversion
      String xml = xstream.toXML(student);
      System.out.println(formatXml(xml));

     //XML to Object Conversion
      Student student1 = (Student)xstream.fromXML(xml);
      System.out.println(student1);
   }

   private Student getStudentDetails() {

      Student student = new Student();
      student.setFirstName("Mahesh");
      student.setLastName("Parashar");
      student.setRollNo(1);
      student.setClassName("1st");

      Address address = new Address();
      address.setArea("H.No. 16/3, Preet Vihar.");
      address.setCity("Delhi");
      address.setState("Delhi");
      address.setCountry("India");
      address.setPincode(110012);

      student.setAddress(address);
      return student;
   }

   public static String formatXml(String xml) {

      try {
         Transformer serializer = SAXTransformerFactory.newInstance().newTransformer();

         serializer.setOutputProperty(OutputKeys.INDENT, "yes");
         serializer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");

         Source xmlSource = new SAXSource(new InputSource(
            new ByteArrayInputStream(xml.getBytes())));
         StreamResult res =  new StreamResult(new ByteArrayOutputStream());

         serializer.transform(xmlSource, res);

         return new String(((ByteArrayOutputStream)res.getOutputStream()).toByteArray());

      } catch(Exception e) {
         return xml;
      }
   }
}

class Student {
   private int rollNo;
   private String firstName;
   private String lastName;
   private String className;
   private Address address;

   public String getFirstName() {
      return firstName;
   }

   public void setFirstName(String firstName) {
      this.firstName = firstName;
   }

   public String getLastName() {
      return lastName;
   }

   public void setLastName(String lastName) {
      this.lastName = lastName;
   }

   public int getRollNo() {
      return rollNo;
   }

   public void setRollNo(int rollNo) {
      this.rollNo = rollNo;
   }

   public String getClassName() {
      return className;
   }

   public void setClassName(String className) {
      this.className = className;
   }

   public Address getAddress() {
      return address;
   }

   public void setAddress(Address address) {
      this.address = address;
   }

   public String toString() {
      StringBuilder stringBuilder = new StringBuilder();

      stringBuilder.append("Student [ ");
      stringBuilder.append("\nfirstName: ");
      stringBuilder.append(firstName);
      stringBuilder.append("\nlastName: ");
      stringBuilder.append(lastName);
      stringBuilder.append("\nrollNo: ");
      stringBuilder.append(rollNo);
      stringBuilder.append("\nclassName: ");
      stringBuilder.append(className);
      stringBuilder.append("\naddress: ");
      stringBuilder.append(address);
      stringBuilder.append(" ]");

      return stringBuilder.toString();
   }
}

class Address {
   private String area;
   private String city;
   private String state;
   private String country;
   private int pincode;

   public String getArea() {
      return area;
   }

   public void setArea(String area) {
      this.area = area;
   }

   public String getCity() {
      return city;
   }

   public void setCity(String city) {
      this.city = city;
   }

   public String getState() {
      return state;
   }

   public void setState(String state) {
      this.state = state;
   }

   public String getCountry() {
      return country;
   }

   public void setCountry(String country) {
      this.country = country;
   }

   public int getPincode() {
      return pincode;
   }

   public void setPincode(int pincode) {
      this.pincode = pincode;
   }

   public String toString() {

      StringBuilder stringBuilder = new StringBuilder();

      stringBuilder.append("\nAddress [ ");
      stringBuilder.append("\narea: ");
      stringBuilder.append(area);
      stringBuilder.append("\ncity: ");
      stringBuilder.append(city);
      stringBuilder.append("\nstate: ");
      stringBuilder.append(state);
      stringBuilder.append("\ncountry: ");
      stringBuilder.append(country);
      stringBuilder.append("\npincode: ");
      stringBuilder.append(pincode);
      stringBuilder.append(" ]");

      return stringBuilder.toString();
   }
}

結果の確認

次のように javac コンパイラを使用してクラスをコンパイルします-

C:\XStream_WORKSPACE>javac XStreamTester.java

今、結果を見るためにXStreamTesterを実行します-

C:\XStream_WORKSPACE>java XStreamTester

出力を次のように確認します

<?xml version = "1.0" encoding = "UTF-8"?>
<Student>
   <firstName>Mahesh</firstName>
   <lastName>Parashar</lastName>
   <rollNo>1</rollNo>
   <className>1st</className>
   <address>
      <area>H.No. 16/3, Preet Vihar.</area>
      <city>Delhi</city>
      <state>Delhi</state>
      <country>India</country>
      <pincode>110012</pincode>
   </address>
</Student>

Student [
   firstName: Mahesh
   lastName: Parashar
   rollNo: 1
   className: 1st
   address:
   Address [
      area: H.No. 16/3, Preet Vihar.
      city: Delhi
      state: Delhi
      country: India
      pincode: 110012
   ]
]

覚えておくべき手順

以下は、ここで考慮すべき重要な手順です。

ステップ1:XStreamオブジェクトを作成する

StaxDriverを渡してXStreamオブジェクトを作成します。 StaxDriverはStax pullパーサー(Java 6から利用可能)を使用し、高速のXMLパーサーです。

XStream xstream = new XStream(new StaxDriver());

ステップ2:オブジェクトをXMLにシリアル化する

toXML()メソッドを使用して、オブジェクトのXML文字列表現を取得します。

//Object to XML Conversion
String xml = xstream.toXML(student);

手順3:XMLを逆シリアル化してオブジェクトを取得する

fromXML()メソッドを使用して、XMLからオブジェクトを取得します。

//XML to Object Conversion
Student student1 = (Student)xstream.fromXML(xml);

XStream-エイリアシング

エイリアシングは、生成されたXMLをカスタマイズするか、XStreamを使用して特定のフォーマットされたXMLを使用する技術です。 Studentオブジェクトのシリアル化/逆シリアル化に次のXML形式を使用するとします。

<student name = "Suresh">
   <note>
      <title>first</title>
      <description>My first assignment.</description>
   </note>

   <note>
      <title>second</title>
      <description>My second assignment.</description>
   </note>
</student>

上記のXML形式に基づいて、モデルクラスを作成しましょう。

class Student {
   private String studentName;
   private List<Note> notes = new ArrayList<Note>();

   public Student(String name) {
      this.studentName = name;
   }

   public void addNote(Note note) {
      notes.add(note);
   }

   public String getName() {
      return studentName;
   }

   public List<Note> getNotes() {
      return notes;
   }
}

class Note {
   private String title;
   private String description;

   public Note(String title, String description) {
      this.title = title;
      this.description = description;
   }

   public String getTitle() {
      return title;
   }

   public String getDescription() {
      return description;
   }
}

XStreamを使用して上記のオブジェクトのシリアル化をテストしましょう。

C:\> XStream_WORKSPACE \ com \ finddevguides \ xstreamにXStreamTesterという名前のJavaクラスファイルを作成します。

*_ファイル:XStreamTester.java_*
package com.finddevguides.xstream;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;

import java.util.ArrayList;
import java.util.List;

import javax.xml.transform.OutputKeys;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.sax.SAXSource;
import javax.xml.transform.sax.SAXTransformerFactory;
import javax.xml.transform.stream.StreamResult;

import org.xml.sax.InputSource;

import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.StaxDriver;

public class XStreamTester {
   public static void main(String args[]) {

      XStreamTester tester = new XStreamTester();
      XStream xstream = new XStream(new StaxDriver());
      Student student = tester.getStudentDetails();

     //Object to XML Conversion
      String xml = xstream.toXML(student);
      System.out.println(formatXml(xml));
   }

   private Student getStudentDetails() {

      Student student = new Student("Mahesh");

      student.addNote(new Note("first","My first assignment."));
      student.addNote(new Note("second","My Second assignment."));

      return student;
   }

   public static String formatXml(String xml) {

      try {
         Transformer serializer = SAXTransformerFactory.newInstance().newTransformer();

         serializer.setOutputProperty(OutputKeys.INDENT, "yes");
         serializer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");

         Source xmlSource = new SAXSource(new InputSource(
            new ByteArrayInputStream(xml.getBytes())));
         StreamResult res =  new StreamResult(new ByteArrayOutputStream());

         serializer.transform(xmlSource, res);

         return new String(((ByteArrayOutputStream)res.getOutputStream()).toByteArray());

      } catch(Exception e) {
         return xml;
      }
   }
}

class Student {
   private String studentName;
   private List<Note> notes = new ArrayList<Note>();

   public Student(String name) {
      this.studentName = name;
   }

   public void addNote(Note note) {
      notes.add(note);
   }

   public String getName() {
      return studentName;
   }

   public List<Note> getNotes() {
      return notes;
   }
}

class Note {
   private String title;
   private String description;

   public Note(String title, String description) {
      this.title = title;
      this.description = description;
   }

   public String getTitle() {
      return title;
   }

   public String getDescription() {
      return description;
   }
}

結果の確認

次のように javac コンパイラを使用してクラスをコンパイルします-

C:\XStream_WORKSPACE\com\finddevguides\xstream>javac XStreamTester.java

今、結果を見るためにXStreamTesterを実行します-

C:\XStream_WORKSPACE\com\finddevguides\xstream>java XStreamTester

次のように出力を確認します-

<?xml version = "1.0" encoding = "UTF-8"?>
<com.finddevguides.xstream.Student>
   <studentName>Mahesh</studentName>
   <notes>
      <com.finddevguides.xstream.Note>
         <title>first</title>
         <description>My first assignment.</description>
      </com.finddevguides.xstream.Note>

      <com.finddevguides.xstream.Note>
         <title>second</title>
         <description>My Second assignment.</description>
     </com.finddevguides.xstream.Note>
   </notes>
</com.finddevguides.xstream.Student>

上記の結果では、Studentオブジェクト名は完全修飾されています。 学生タグとして置き換えるには、次のセクションに従ってください。

  • リンク:/xstream/xstream_class_aliasing [クラスのエイリアス]
  • リンク:/xstream/xstream_field_aliasing [フィールドのエイリアス]
  • リンク:/xstream/xstream_implicit_aliasing [Implicit Collections Aliasing]
  • リンク:/xstream/xstream_attribute_aliasing [属性のエイリアス]
  • リンク:/xstream/xstream_package_aliasing [パッケージのエイリアス]

XStream-注釈

XStreamは、コーディングの代わりに自動構成のような注釈を同様にサポートします。 前の章では、コードで次の構成を見てきました。

xstream.alias("student", Student.class);
xstream.alias("note", Note.class);

xstream.useAttributeFor(Student.class, "studentName");
xstream.aliasField("name", Student.class, "studentName");
xstream.addImplicitCollection(Student.class, "notes");

次のコードスニペットは、アノテーションを使用して同じ作業をはるかに簡単に行う方法を示しています。

@XStreamAlias("student")  //define class level alias
class Student {

   @XStreamAlias("name")  //define field level alias
   @XStreamAsAttribute    //define field as attribute
   private String studentName;

   @XStreamImplicit       //define list as an implicit collection
   private List<Note> notes = new ArrayList<Note>();

   @XStreamOmitField      //omit a field to not to be a part of XML
   private int type;
}

XStreamを使用して上記の注釈をテストしてみましょう。

*C:\> XStream_WORKSPACE \ com \ finddevguides \ xstream* にXStreamTesterという名前のJavaクラスファイルを作成します。

ファイル:XStreamTester.java

package com.finddevguides.xstream;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;

import java.util.ArrayList;
import java.util.List;

import javax.xml.transform.OutputKeys;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.sax.SAXSource;
import javax.xml.transform.sax.SAXTransformerFactory;
import javax.xml.transform.stream.StreamResult;

import org.xml.sax.InputSource;

import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
import com.thoughtworks.xstream.annotations.XStreamImplicit;
import com.thoughtworks.xstream.annotations.XStreamOmitField;
import com.thoughtworks.xstream.io.xml.StaxDriver;

public class XStreamTester {

   public static void main(String args[]) {

      XStreamTester tester = new XStreamTester();
      XStream xstream = new XStream(new StaxDriver());
      Student student = tester.getStudentDetails();

      xstream.processAnnotations(Student.class);

     //Object to XML Conversion
      String xml = xstream.toXML(student);
      System.out.println(formatXml(xml));
   }

   private Student getStudentDetails() {

      Student student = new Student("Mahesh");

      student.addNote(new Note("first","My first assignment."));
      student.addNote(new Note("second","My Second assignment."));
      student.setType(1);

      return student;
   }

   public static String formatXml(String xml) {

      try {
         Transformer serializer = SAXTransformerFactory.newInstance().newTransformer();

         serializer.setOutputProperty(OutputKeys.INDENT, "yes");
         serializer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");

         Source xmlSource = new SAXSource(new InputSource(
            new ByteArrayInputStream(xml.getBytes())));
         StreamResult res = new StreamResult(new ByteArrayOutputStream());

         serializer.transform(xmlSource, res);

         return new String(((ByteArrayOutputStream)res.getOutputStream()).toByteArray());

      } catch(Exception e) {
         return xml;
      }
   }
}

@XStreamAlias("student")
class Student {

   @XStreamAlias("name")
   @XStreamAsAttribute
   private String studentName;

   @XStreamImplicit
   private List<Note> notes = new ArrayList<Note>();

   public Student(String name) {
      this.studentName = name;
   }

   public void addNote(Note note) {
      notes.add(note);
   }

   public String getName() {
      return studentName;
   }

   public List<Note> getNotes() {
      return notes;
   }

   @XStreamOmitField
   private int type;

   public int getType() {
      return type;
   }

   public void setType(int type) {
      this.type = type;
   }
}

@XStreamAlias("note")
class Note {
   private String title;
   private String description;

   public Note(String title, String description) {
      this.title = title;
      this.description = description;
   }

   public String getTitle() {
      return title;
   }

   public String getDescription() {
      return description;
   }
}

結果を確認する

次のように javac コンパイラを使用してクラスをコンパイルします-

C:\XStream_WORKSPACE\com\finddevguides\xstream>javac XStreamTester.java

今、結果を見るためにXStreamTesterを実行します-

C:\XStream_WORKSPACE\com\finddevguides\xstream>java XStreamTester

次のように出力を確認します-

<?xml version = "1.0" encoding = "UTF-8"?>
<student name = "Mahesh">
   <note>
      <title>first</title>
      <description>My first assignment.</description>
   </note>

   <note>
      <title>second</title>
      <description>My Second assignment.</description>
   </note>
</student>

XStreamフレームワークに注釈を処理するように指示するには、xmlをシリアル化する前に次のコマンドを追加する必要があります。

xstream.processAnnotations(Student.class);

Or

xstream.autodetectAnnotations(true);

XStream-コンバーター

XStreamコンバーターは、XStreamライブラリの重要なコンポーネントであり、オブジェクトをXMLに変換したり、その逆を行ったりします。 XStreamは、プリミティブ、文字列、ファイル、コレクション、配列、日付などの一般的なタイプの多数のコンバーターを提供します。

コンバーターを使用する

オブジェクトを単一の文字列に変換することを目的とするSingleValueConvertorを使用しましょう。 SingleValueConvertorを使用して、オブジェクトを属性文字列として書き込みます。

コンバーターを作成する

class NameConverter implements SingleValueConverter {

   public Object fromString(String name) {
      String[] nameparts = name.split(",");
      return new Name(nameparts[0], nameparts[1]);
   }

   public String toString(Object name) {
      return ((Name)name).getFirstName() + "," + ((Name)name).getLastName();
   }

   public boolean canConvert(Class type) {
      return type.equals(Name.class);
   }
}

コンバーターを登録する

xstream.registerConverter(new NameConverter());

コンバーターなしの例

XStreamでコンバーターなしでコードを最初にテストしましょう。

C:\> XStream_WORKSPACE \ com \ finddevguides \ xstreamにXStreamTesterという名前のJavaクラスファイルを作成します。

*_ファイル:XStreamTester.java_*
package com.finddevguides.xstream;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;

import javax.xml.transform.OutputKeys;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.sax.SAXSource;
import javax.xml.transform.sax.SAXTransformerFactory;
import javax.xml.transform.stream.StreamResult;

import org.xml.sax.InputSource;

import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
import com.thoughtworks.xstream.io.xml.StaxDriver;

public class XStreamTester {
   public static void main(String args[]) {

      XStreamTester tester = new XStreamTester();
      XStream xstream = new XStream(new StaxDriver());
      Student student = tester.getStudentDetails();
      xstream.autodetectAnnotations(true);

     //Object to XML Conversion
      String xml = xstream.toXML(student);
      System.out.println(formatXml(xml));
   }

   private Student getStudentDetails() {
      Student student = new Student("Mahesh","Parashar");
      return student;
   }

   public static String formatXml(String xml) {

      try {

         Transformer serializer = SAXTransformerFactory.newInstance().newTransformer();

         serializer.setOutputProperty(OutputKeys.INDENT, "yes");
         serializer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");

         Source xmlSource = new SAXSource(new InputSource(
            new ByteArrayInputStream(xml.getBytes())));
         StreamResult res =  new StreamResult(new ByteArrayOutputStream());

         serializer.transform(xmlSource, res);

         return new String(((ByteArrayOutputStream)res.getOutputStream()).toByteArray());

      } catch(Exception e) {
         return xml;
      }
   }
}

@XStreamAlias("student")
class Student {

   @XStreamAlias("name")
   @XStreamAsAttribute
   private Name studentName;

   public Student(String firstName, String lastName) {
      this.studentName = new Name(firstName, lastName);
   }

   public Name getName() {
      return studentName;
   }
}

class Name {
   private String firstName;
   private String lastName;

   public Name(String firstName, String lastName) {
      this.firstName = firstName;
      this.lastName = lastName;
   }

   public String getFirstName() {
      return firstName;
   }

   public String getLastName() {
      return lastName;
   }
}

結果の確認

次のように javac コンパイラを使用してクラスをコンパイルします-

C:\XStream_WORKSPACE\com\finddevguides\xstream>javac XStreamTester.java

今、結果を見るためにXStreamTesterを実行します-

C:\XStream_WORKSPACE\com\finddevguides\xstream>java XStreamTester

次のように出力を確認します-

<?xml version = "1.0" encoding = "UTF-8"?>
<student>
   <name>
      <firstName>Mahesh</firstName>
      <lastName>Parashar</lastName>
   </name>
</student>

コンバーターの例

XStreamのコンバーターでコードをテストしましょう。

C:\> XStream_WORKSPACE \ com \ finddevguides \ xstreamにXStreamTesterという名前のJavaクラスファイルを作成します。

*_ファイル:XStreamTester.java_*
package com.finddevguides.xstream;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;

import javax.xml.transform.OutputKeys;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.sax.SAXSource;
import javax.xml.transform.sax.SAXTransformerFactory;
import javax.xml.transform.stream.StreamResult;

import org.xml.sax.InputSource;

import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
import com.thoughtworks.xstream.converters.SingleValueConverter;
import com.thoughtworks.xstream.io.xml.StaxDriver;

public class XStreamTester {

   public static void main(String args[]) {

      XStreamTester tester = new XStreamTester();
      XStream xstream = new XStream(new StaxDriver());
      Student student = tester.getStudentDetails();

      xstream.autodetectAnnotations(true);
      xstream.registerConverter(new NameConverter());

     //Object to XML Conversion
      String xml = xstream.toXML(student);
      System.out.println(formatXml(xml));
   }

   private Student getStudentDetails() {
      Student student = new Student("Mahesh","Parashar");
      return student;
   }

   public static String formatXml(String xml) {

      try {

         Transformer serializer = SAXTransformerFactory.newInstance().newTransformer();

         serializer.setOutputProperty(OutputKeys.INDENT, "yes");
         serializer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");

         Source xmlSource = new SAXSource(new InputSource(
            new ByteArrayInputStream(xml.getBytes())));
         StreamResult res = new StreamResult(new ByteArrayOutputStream());

         serializer.transform(xmlSource, res);

         return new String(((ByteArrayOutputStream)res.getOutputStream()).toByteArray());

      } catch(Exception e) {
         return xml;
      }
   }
}

@XStreamAlias("student")
class Student {

   @XStreamAlias("name")
   @XStreamAsAttribute
   private Name studentName;

   public Student(String firstName, String lastName) {
      this.studentName = new Name(firstName, lastName);
   }

   public Name getName() {
      return studentName;
   }
}

class Name {
   private String firstName;
   private String lastName;

   public Name(String firstName, String lastName) {
      this.firstName = firstName;
      this.lastName = lastName;
   }

   public String getFirstName() {
      return firstName;
   }

   public String getLastName() {
      return lastName;
   }
}

class NameConverter implements SingleValueConverter  {

   public Object fromString(String name) {
      String[] nameparts = name.split(",");
      return new Name(nameparts[0], nameparts[1]);
   }

   public String toString(Object name) {
      return ((Name)name).getFirstName() + "," + ((Name)name).getLastName();
   }

   public boolean canConvert(Class type) {
      return type.equals(Name.class);
   }
}

結果の確認

次のように javac コンパイラを使用してクラスをコンパイルします-

C:\XStream_WORKSPACE\com\finddevguides\xstream>javac XStreamTester.java

今、結果を見るためにXStreamTesterを実行します-

C:\XStream_WORKSPACE\com\finddevguides\xstream>java XStreamTester

次のように出力を確認します-

<?xml version = "1.0" encoding = "UTF-8"?>
<student name = "Mahesh,Parashar"/>

リンク:/xstream/xstream_custom_converter [カスタムコンバーター]

XStream-オブジェクトストリーム

XStreamは、java.io.ObjectInputStreamおよびjava.io.ObjectOutputStreamの代替実装を提供するため、オブジェクトのストリームをXMLからシリアル化または非シリアル化できます。 これは、一度に1つのオブジェクトをメモリに保持し、オブジェクトの大きなセットを処理する場合に特に役立ちます。

構文:createObjectOutputStream()

ObjectOutputStream objectOutputStream = xstream.createObjectOutputStream(
   new FileOutputStream("test.txt"));

構文:createObjectInputStream()

ObjectInputStream objectInputStream = xstream.createObjectInputStream(
   new FileInputStream("test.txt"));

XStreamでオブジェクトストリームを使用してコードをテストしましょう。

C:\> XStream_WORKSPACE \ com \ finddevguides \ xstreamにXStreamTesterという名前のJavaクラスファイルを作成します。

ファイル:XStreamTester.java

package com.finddevguides.xstream;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.io.xml.StaxDriver;

public class XStreamTester {
   public static void main(String args[]) {

      XStreamTester tester = new XStreamTester();
      XStream xstream = new XStream(new StaxDriver());

      xstream.autodetectAnnotations(true);

      Student student1 = new Student("Mahesh","Parashar");
      Student student2 = new Student("Suresh","Kalra");
      Student student3 = new Student("Ramesh","Kumar");
      Student student4 = new Student("Naresh","Sharma");

      try {

         ObjectOutputStream objectOutputStream = xstream.createObjectOutputStream(
            new FileOutputStream("test.txt"));

         objectOutputStream.writeObject(student1);
         objectOutputStream.writeObject(student2);
         objectOutputStream.writeObject(student3);
         objectOutputStream.writeObject(student4);
         objectOutputStream.writeObject("Hello World");

         objectOutputStream.close();

         ObjectInputStream objectInputStream = xstream.createObjectInputStream(
            new FileInputStream("test.txt"));

         Student student5 = (Student)objectInputStream.readObject();
         Student student6 = (Student)objectInputStream.readObject();
         Student student7 = (Student)objectInputStream.readObject();
         Student student8 = (Student)objectInputStream.readObject();

         String text = (String)objectInputStream.readObject();

         System.out.println(student5);
         System.out.println(student6);
         System.out.println(student7);
         System.out.println(student8);
         System.out.println(text);

      } catch (IOException e) {
         e.printStackTrace();

      } catch (ClassNotFoundException e) {
         e.printStackTrace();
      }
   }
}

@XStreamAlias("student")
class Student {

   private String firstName;
   private String lastName;

   public Student(String firstName, String lastName) {
      this.firstName = firstName;
      this.lastName = lastName;
   }

   public String getFirstName() {
      return firstName;
   }

   public String getLastName() {
      return lastName;
   }

   public String toString() {
      return "Student [ firstName: "+firstName+", lastName: "+ lastName+ " ]";
   }
}

結果を確認する

次のように javac コンパイラを使用してクラスをコンパイルします-

C:\XStream_WORKSPACE\com\finddevguides\xstream>javac XStreamTester.java

今、結果を見るためにXStreamTesterを実行します-

C:\XStream_WORKSPACE\com\finddevguides\xstream>java XStreamTester

次のように出力を確認します-

Student [ firstName: Mahesh, lastName: Parashar ]
Student [ firstName: Suresh, lastName: Kalra ]
Student [ firstName: Ramesh, lastName: Kumar ]
Student [ firstName: Naresh, lastName: Sharma ]
Hello World
*C:\> XStream_WORKSPACE \ com \ finddevguides \ xstream* フォルダーにあるtest.txtの内容を確認します。
<?xml version = "1.0" ?>
<object-stream>
   <student>
      <firstName>Mahesh</firstName>
      <lastName>Parashar</lastName>
   </student>

   <student>
      <firstName>Suresh</firstName>
      <lastName>Kalra</lastName>
   </student>

   <student>
      <firstName>Ramesh</firstName>
      <lastName>Kumar</lastName>
   </student>

   <student>
      <firstName>Naresh</firstName>
      <lastName>Sharma</lastName>
   </student>
   <string>Hello World</string>
</object-stream>

XStream-XStreamを使用したJSONの作成

XStreamは、適切なドライバーでXStreamオブジェクトを初期化することでJSONをサポートします。 XStreamは現在、JettisonMappedXmlDriverおよびJsonHierarchicalStreamDriverをサポートしています。

XStreamでjsonを処理してコードをテストしましょう。

C:\> XStream_WORKSPACE \ com \ finddevguides \ xstreamにXStreamTesterという名前のJavaクラスファイルを作成します。

ファイル:XStreamTester.java

package com.finddevguides.xstream;

import java.io.Writer;

import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
import com.thoughtworks.xstream.io.json.JsonHierarchicalStreamDriver;
import com.thoughtworks.xstream.io.json.JsonWriter;

public class XStreamTester {

   public static void main(String args[]) {

      XStreamTester tester = new XStreamTester();
      XStream xstream = new XStream(new JsonHierarchicalStreamDriver() {

         public HierarchicalStreamWriter createWriter(Writer writer) {
            return new JsonWriter(writer, JsonWriter.DROP_ROOT_MODE);
         }
      });

      Student student = new Student("Mahesh","Parashar");

      xstream.setMode(XStream.NO_REFERENCES);
      xstream.alias("student", Student.class);

      System.out.println(xstream.toXML(student));
   }
}

@XStreamAlias("student")
class Student {

   private String firstName;
   private String lastName;

   public Student(String firstName, String lastName) {
      this.firstName = firstName;
      this.lastName = lastName;
   }

   public String getFirstName() {
      return firstName;
   }

   public String getLastName() {
      return lastName;
   }

   public String toString() {
      return "Student [ firstName: "+firstName+", lastName: "+ lastName+ " ]";
   }
}

結果を確認する

次のように javac コンパイラを使用してクラスをコンパイルします-

C:\XStream_WORKSPACE\com\finddevguides\xstream>javac XStreamTester.java

今、結果を見るためにXStreamTesterを実行します-

C:\XStream_WORKSPACE\com\finddevguides\xstream>java XStreamTester

次のように出力を確認します-

{
   "firstName": "Mahesh",
   "lastName": "Parashar"
}