便利なコードパーツ集!

やまろうのプログラミングTips

Java

XMLとObjectの双方向変換はjava.beans.XMLEncoder &XMLDecoderで簡単

投稿日:

2009/4

JAXBとかcommons.digester等、XML←→Object変換するライブラリはたくさん
ありますが、実はJDKのクラスの中にも存在するのです。
それが
・java.beans.XMLEncoder
・java.beans.XMLDecoder
です。使い方は簡単です。コードを見てみましょう!!

package sample.xmlconvert;

import java.beans.XMLDecoder;
import java.beans.XMLEncoder;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;

public class XMLConvertSample {
  public static void main(String[] args) throws FileNotFoundException {
    //値オブジェクトを作成
    ValueObject1 vo1 = new ValueObject1();
    vo1.setString1("Lust");
    vo1.setInt1(139);
    vo1.setDouble1(56.7);
    ArrayList list = new ArrayList();
    list.add("Greed");
    list.add("Edo");
    list.add(new Date());
    ValueObject2 vo2 = new ValueObject2();
    vo2.setMoney(new Integer("156488"));
    vo2.setName("Mastang");
    vo2.setTax(1.546588f);
    list.add(vo2);
    vo1.setArrayList1(list);
    HashMap map = new HashMap();
    map.put("key1", "Aru");
    map.put("key2", "Winly");
    map.put("key3", vo2);
    vo1.setHashMap1(map);

    //値オブジェクトをXMLに変換(Object → XML)してファイルに出力する。
    XMLEncoder e =
      new XMLEncoder(
        new BufferedOutputStream(new FileOutputStream("Test.xml")));
    e.writeObject(vo1);
    e.close();

    //XMLを値オブジェクトに変換(XML → Object)
    XMLDecoder d =
      new XMLDecoder(
        new BufferedInputStream(new FileInputStream("Test.xml")));
    Object result = d.readObject();
    d.close();

    //値オブジェクトをコンソールに出力する
    ValueObject1 resultVo1 = (ValueObject1) result;
    System.out.println("getDouble1=" + resultVo1.getDouble1());
    System.out.println("getInt1=" + resultVo1.getInt1());
    System.out.println("getString1=" + resultVo1.getString1());
    System.out.println("getArrayList1=" + resultVo1.getArrayList1());
    System.out.println("getHashMap1=" + resultVo1.getHashMap1());
  }
}

package sample.xmlconvert;

import java.util.ArrayList;
import java.util.HashMap;

public class ValueObject1 {
  private String string1;
  private int int1;
  private double double1;
  private ArrayList arrayList1;
  private HashMap hashMap1;

  public ArrayList getArrayList1() {
    return arrayList1;
  }

  public double getDouble1() {
    return double1;
  }

  public HashMap getHashMap1() {
    return hashMap1;
  }

  public int getInt1() {
    return int1;
  }

  public String getString1() {
    return string1;
  }

  public void setArrayList1(ArrayList list) {
    arrayList1 = list;
  }

  public void setDouble1(double d) {
    double1 = d;
  }

  public void setHashMap1(HashMap map) {
    hashMap1 = map;
  }

  public void setInt1(int i) {
    int1 = i;
  }

  public void setString1(String string) {
    string1 = string;
  }
}

package sample.xmlconvert;

public class ValueObject2 {
  private String name;
  private float tax;
  private Integer money; 

  public Integer getMoney() {
    return money;
  }

  public String getName() {
    return name;
  }

  public float getTax() {
    return tax;
  }

  public void setMoney(Integer integer) {
    money = integer;
  }

  public void setName(String string) {
    name = string;
  }

  public void setTax(float f) {
    tax = f;
  }
}

[実行結果]

getDouble1=56.7
getInt1=139
getString1=Lust
getArrayList1=[Greed, Edo, Tue Apr 08 16:01:26 JST 2008,
sample.xmlconvert.ValueObject2@5be64f80]
getHashMap1={key1=Aru, key3=sample.xmlconvert.ValueObject2@5be64f80,
key2=Winly}

[Test.xml]

<?xml version="1.0" encoding="UTF-8"?>
<java version="1.4.1" class="java.beans.XMLDecoder">
<object class="sample.xmlconvert.ValueObject1">
<void property="arrayList1">
<object class="java.util.ArrayList">
<void method="add">
<string>Greed</string>
</void>
<void method="add">
<string>Edo</string>
</void>
<void method="add">
<object class="java.util.Date">
<long>1207638086172</long>
</object>
</void>
<void method="add">
<object id="ValueObject20" class="sample.xmlconvert.ValueObject2">
<void property="money">
<int>156488</int>
</void>
<void property="name">
<string>Mastang</string>
</void>
<void property="tax">
<float>1.546588</float>
</void>
</object>
</void>
</object>
</void>
<void property="double1">
<double>56.7</double>
</void>
<void property="hashMap1">
<object class="java.util.HashMap">
<void method="put">
<string>key1</string>
<string>Aru</string>
</void>
<void method="put">
<string>key3</string>
<object idref="ValueObject20"/>
</void>
<void method="put">
<string>key2</string>
<string>Winly</string>
</void>
</object>
</void>
<void property="int1">
<int>139</int>
</void>
<void property="string1">
<string>Lust</string>
</void>
</object>
</java>

ArrayListやHashMapも変換できるようです。
しかし、BigIntegerは駄目でした。変換させようとすると
下記のようにコンソールに出力されXMLにはBigIntegerの値は出力されません。
[実行結果]

java.lang.InstantiationException: java.math.BigInteger
Continuing ...
java.lang.RuntimeException: failed to evaluate: <unbound>=BigInteger.new();
Continuing ...

ってことで、やっぱりJAXBとかcommons.digester
とかを使った方がいいかもしれません。

スポンサーリンク

-Java

Copyright© やまろうのプログラミングTips , 2024 AllRights Reserved Powered by AFFINGER4.