ラベル Java の投稿を表示しています。 すべての投稿を表示
ラベル Java の投稿を表示しています。 すべての投稿を表示

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();
 }

2011年6月16日木曜日

オブジェクトのXML保存

Webアプリケーションを開発しているとオブジェクトをデータベースに保存したくなる時があります。
オブジェクトをXML化してテキスト形式として保存しておけば楽ちんですね。

そこで、まずはXMLが取り扱えるようにすべくネットを検索してみるとDOM4Jがよさげです。
現在の開発環境を調べてみると、すでにDOM4Jが使えるようになっていました(^^;

ところがドキュメント、サンプルでめぼしい物が見当たりません。しかたが無いのでXMLの基礎知識をざっと読みあさってから、ドキュメントを参考にしながら簡単なXMLドキュメントを作成して見たのが次のソースです。

例:
「HogeBeanのコンストラクタ引数をXMLで保存しておいて、後でインスタンスを動的に生成する」という利用を想定してみました。

Document doc = DocumentHelper.createDocument();
 Element eleBoject = DocumentHelper.createElement(DocumentHelper.createQName("Object"));

 Element eleName = DocumentHelper.createElement(DocumentHelper.createQName("Name"));
 eleName.add(DocumentHelper.createText("HogeBean"));
 eleBoject.add(eleName); // Node 0

 Element arg0 = DocumentHelper.createElement(DocumentHelper.createQName("key"));
 arg0.addAttribute("index", "0");
 arg0.addAttribute("class", "jp.co.hoge.hoge0");
 arg0.add(DocumentHelper.createText("hikisuu0"));
 eleBoject.add(arg0); // Node 1

 Element arg1 = DocumentHelper.createElement(DocumentHelper.createQName("key"));
 arg1.addAttribute("index", "1");
 arg1.addAttribute("class", "jp.co.hoge.hoge1");
 arg1.add(DocumentHelper.createText("hikisuu1"));
 eleBoject.add(arg1); // Node 2

 doc.add(eleBoject);
 String text = doc.asXML();
 System.out.println(text);

あとは、文字列として保存しておくだけです。

次に、保存したテキストからドキュメントオブジェクトに変換については

Document doc = DocumentHelper.parseText(テキスト);

で、簡単にドキュメントオブジェクトに変換できます。
あとは、このドキュメントから情報を取り出すだけですが、そのサンプルが以下のソースになります。

Element o = doc.getRootElement();
  if(o.getQName().getName().equals("Object")){
   for(int j = 0; j < o.nodeCount(); j++){
    Node n = o.node(j);
    if(n.getNodeType() == Node.ELEMENT_NODE){
     Element e = (Element) n;
     if(e.getQName().getName().equals("Name")){
      System.out.println(e.getText());
     }else if(e.getQName().getName().equals("key")){
      for(int k = 0; k < e.attributeCount(); k++){
       Attribute a = e.attribute(k);
       System.out.println(a.getName()+ "=" + a.getText());
      }
     }else{
      // 必要に応じてNodeを判定して処理します。
     }
    }
   }
  }

保存されたクラス名とコンストラクタ引数が取得できたので、あとは動的にインスタンスを生成するだけですが、その方法は別途調べないといけません(^^;

2011年6月13日月曜日

Googleのブログなのにgoogle-code-prettifyがすぐに使えない!

データをXML形式で保存したいので、dom4jを使ってみることにしました。

ということでサンプルソースを貼り付けることにしましたが、そのままでは非常に見づらいもになってしまいます。CodeZineなどではソースを色付けして見やすく表示しています。いろいろと調べてみるとどうやらGoogleがgoogle-code-prettifyなるすぐれものを公開してくれているようです。

それならGoogleのブログだからそのまま使えるかと思って<pre class="prettyprint"></pre>で囲ってプレビューを見ても何も変わりません。

どうやらstylesheetとjavascriptを取り込む必要があるようです。Googleとは言え、プログラマばかりがブログを書くわけではないのでデフォルトでは使えないようになっているようです。ブログも使い始めて間もないので、何がどうなっているのか手さぐり状態ですが、どうやらテンプレートをカスタマイズする必要があるようです。ブログの管理ページでデザインタグをクリックして、HTML編集でテンプレートのHTMLを表示させて、

<link rel="stylesheet" href="http://google-code-prettify.googlecode.com/svn/trunk/src/prettify.css" type="text/css" media="screen" />
<script type="text/javascript" src="http://google-code-prettify.googlecode.com/svn/trunk/src/prettify.js"></script>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.min.js"></script>
<script type="text/javascript">

を</head>の直前に挿入して
onload='prettyPrint();'
をbodyタグに追加したところ色分けしてくれるようになりました。