金曜日, 18 2 月 2005

Betwixtによるオブジェクトのシリアライズ/デシリアライズ
この記事をクリップ!
このエントリーをはてなブックマークに追加

« 今日のフェレット | Main | フード買ってきたー »
Coomons BetwixtはBeanオブジェクトからXMLへのシリアライズや逆のXMLからBeanオブジェクトへのデシリアライズを行うライブラリだ。
通常のObjectOutputStreamを使用するシリアライズと違って出力されるファイルがXML形式なため可読性が高く、その上XMLの編集によりデシリアライズ後のオブジェクトの状態まで変更することが可能である。
使用方法はとてもシンプルでBeanReaderによりXMLを読み込んでオブジェクトを生成し、BeanWriterによりオブジェクトをXMLに出力するというものだ。
XMLの要素名はそのままBeanのアクセッサメソッドからgetやadd等の接頭語が取られた状態の名前になるので直感的に理解できると思う。
以下のサンプルは本を表したBookとそのBookをリストで管理するLibraryをXMLから読み込み、一つBookを追加して書き出すというものである。
//Bookオブジェクト
public class Book{
  private String _name;

  public Book(String name){
    _name=name;
  }

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

  public String getName(){
    return _name;
  }
}
//Libraryオブジェクト
import java.util.List;
import java.util.ArrayList;

public class Library{
  List _books=new ArrayList();

  public void addBook(Book book){
    _books.add(book);
  }

  public Book[] getBooks(){
    Book[] resultBooks=new Book[_books.size()];
    _books.toArray(resultBooks);

    return resultBooks;
  }
}
//実行
File file=new File("library.xml");
BeanReader reader=new BeanReader();
reader.registerBeanClass(Library.class);
Library library=(Library)reader.parse(file);

//Book[] books=library.getBooks();
//for(int i=0;i<books.length;i++)
//  System.out.println("book "+books[i].getName());

library.addBook(new Book("new book"));

OutputStreamWriter owriter = new OutputStreamWriter(new FileOutputStream(file),"utf-8");
owriter.write("<?xml version='1.0' encoding='utf-8'?>");
BeanWriter writer = new BeanWriter(owriter);
writer.setWriteIDs(false);
writer.enablePrettyPrint();
writer.write(library);
writer.close();
このサンプルに次のXMLを処理させる。
//library.xml
<?xml version='1.0' encoding='utf-8'?><br>
<Library>
  <books>
    <book>
      <name>book</name>
    </book>
  </books>
</Library>
するとオブジェクトに変換された後、以下のようにbookの要素が一つ追加されて書き出される。
<?xml version='1.0' encoding='utf-8'?>
<Library>
  <books>
    <book>
      <name>book 1</name>
    </book>
    <book>
      <name>new book</name>
    </book>
  </books>
</Library>
複雑なオブジェクトのシリアライズには向かないがちょっとしたBeanを永続化させるにはちょうどいいのではないだろうか。
Posted by tsujitako at 12:45 午前 in Java/