2011年6月17日金曜日

データベースへのオブジェクト格納

最近のデータベースではオブジェクト型(構造体が1つのRowに格納できる)がサポートされるようになったり、BLOB型でバイナリデータの保存が簡単にできるのでDocumentクラスのインスタンスをそのままデータベースに格納してもよさそう(シリアライズ化が必要)ですが今回は勉強の意味も含めてXMLで格納することにしました。

今回は、データへの参照キーを保存するだけですが、このキーの値をXMLで保持する場合は文字列として保存することになります。そうすると、読み込んだ時にテキスト形式から内部形式に変換する必要があり、この時に元のデータ型が何であったかを意識する必要が出てきます。

そこで、キー値をシリアライズ化して、さらにBASE64でテキスト化して保存するようにしてみました。シリアライズ化についてはネットを検索すると、サンプルがたくさんヒットしますが殆どがファイルへの入出力となっています。今回はデータベースの項目として保存する必要があるのでファイルへの入出力ではこまります。

以下はObjectをシリアライズ化してStringで返すメソッドと、Stringで受け取りObject化して返すメソッドです。なお、Base64についてはJakarta Commons Codecなどを使用して下さい。今回はBase64クラスとして実装してある前提です。

// シリアライズ関連
 public String serializableObject(Object obj) throws IOException {
  ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
  new ObjectOutputStream(byteStream).writeObject(obj);
  byte[] serialized = byteStream.toByteArray();
  return Base64.encode(serialized).toString();
 }
 public Object deserializableObject(String src) throws IOException {
  ByteArrayInputStream byteStream = new ByteArrayInputStream(Base64.decode(src.getBytes()));
  return new ObjectInputStream(byteStream).readObject();
 }

0 件のコメント:

コメントを投稿