ka-ka_xyzの日記スマートフォン用の表示で見るスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。読者です読者をやめる読者になる読者になるka-ka_xyzの日記2010-12-18XMLシリアライズ・デシリアライズライブラリ"Simple"JavaXML職場で"XML設定ファイルの仕様+実物を作って欲しい、もちろん急ぎで。"とか言われたものの、スキーマ定義書くのも面倒だしテキストエディタでXML書くのも冗長でめんどくさい。JavaのオブジェクトをそのままXMLに落し込みたいなあ・・・と思って色々とライブラリを探してみた。Digesterだが・・・・XMLファイルから内容を読み込むためのルールをまたXMLで定義するとか、面倒過ぎる。それにcommons系のライブラリは依存jar地獄に陥りがちだし。見つけてきたのが"Simple"。シンプルで楽に使えることを目指しているらしいので、ちょっと使ってみた。jarファイルについて必要なライブラリは下記の3つのみ。ダウンロードページから入手できる。simple-xml-2.4.jarstax-api-1.0.1.jarstax-1.2.0.jarもちろんmavenでもデフォルトのセントラルリポジトリから入手可能。pom.xmlに下記のdependencyを追加すればOK。あり、特にパフォーマンスにこだわらなければ無くても構わないようだ。mavenプロジェクトでこれらのライブラリを除外したい場合には、pom.xmlのdependency設定を下記のようにすればよい。&lt;/exclusions&gt;&lt;/dependency&gt;シリアライズ対象クラスを作るまず最初に、xmlにシリアライズするためのJavaクラスを作っておく。オリジナルの設定クラスは晒せないので、取り敢えずの例として会社を表す"Company"クラスと、そこに所属する従業員を表す"Employee"クラスを作成する。引数nameで、XML要素・属性名を指定することが可能。指定しない場合にはクラス名・クラスプロパティ名となる。アノテーションされたプロパティの値がnullの場合には、XMLシリアライズは失敗する。setter側でnullチェックを行ったほうが良い。アノテーションされていないプロパティはシリアライズされない。次に、従業員リスト要素にネストされるEmployeeクラスを作成。toString()オブジェクトは省略}次に、シリアライズ・デシリアライズを行うためのクラスを作成する。CompanyオブジェクトをXMLに変換します。XMLファイルからCompanyオブジェクトを読む込みます。&quot;皆でイァ!イァ!と称え合うだけの楽しい職場です。}}上記の例で作成されるxmlファイルの内容は、以下のとおり。&lt;/employees&gt;&lt;/company&gt;おお!アノテーションしたとおりにXMLに出力される。エスケープもされてるし、UTF-8で出力されてるから全角文字を含んでも大丈夫だし良かったよかった・・・・と言いたいところだが、xml宣言されてないよ。orzXML宣言を付けるSimpleのチュートリアル(凄く充実してるので、目を通しておいたほうが良い)を探してみたが、特にXML宣言については触れられていなかった。Javadocを探してみると・・・FormatクラスでXML宣言を指定できそう。XmlManager.javaでSerializerを作成する処理にFormatの指定を入れてみた。Persister(format);で、出力されるXMLにちゃんとXML宣言が入っていることを確認した。&lt;/employees&gt;&lt;/company&gt;同じXMLファイルから内容を読み込んで、正しくオブジェクトの値が指定されていることも確認した。文字コードについては、Persisterクラスにcharsetを指定できるメソッドが用意されている。Serializerインターフェイスにはそのメソッドは無いので、注意。まとめxmlスキーマ定義をアノテーションから生成してくれればベストだけど、そこまでは望まない。追記:正直、どのみちスキーマ定義を書くなら最初からjaxb使っておけばよかったのか?Serializer#validateメソッドでバリデーションチェックは出来るわけだし、アノテーション+実装クラスが定義だ!と言い張ってもいい気がしてきた。・・・アノテーションが実質的なスキーマ定義に成ってるわけだが、やはり実装クラス内に定義を書き込むというのは違和感がある。参考資料Simple本家のチュートリアル内容が充実しており、目を通しておいたほうがいいというか必読。シリアライズを行う」Simpleの使い方についての説明としては、DeveloperWorksの記事だけでもなんとかなる。今回のエントリではカバーできなかった「テンプレート・フィルター」機能についても述べられている。正道編「Simpleライブラリの検証(1)」「Simpleライブラリの検証(2)」XML宣言やエンコーディングについては、Javadocを調べる前にぐぐってここを見とけば解決してた。以下追記class属性を消したい上のXMLをよくみると、リスト型要素に必ずclass属性が付き、Javaクラス名が指定されている。class="java.util.ArrayList"実はこの属性を消した状態でXMLファイルを読み込んでもちゃんとオブジェクトにマッピングしてくれるし、設定ファイルとして使うには邪魔なので消してみる。(ただし、実装クラスを指定する必要がある場合もあるので、そういう場合にはむやみに消してしまわないこと!)まずは下記のように、org.simpleframework.xml.strategy.Visitorインターフェイスを実装するクラスを作成し、writeメソッド内にXMLファイルへの書き出し時に行う処理を書いておく。次に、XmlManagerクラス内でPersisterインスタンスを作成するときに、PersisterのコンストラクタでStragegyを指定する。StrategyのインスタンスはVisitorStrategyを使用し、コンストラクタに上で作ったVisitor実装クラスを指定する。Persister(strategy,format);こうして作成したSerializerを使ってxmlファイルに書きこむと、下のようにclass属性が書きだされることは無くなる。&lt;/employees&gt;&lt;/company&gt;このようにVisitor実装クラスを使用することで、属性の削除の他にもXMLへシリアライズするときにコメントを付けることが出来たりと色々便利。Blog|ブログを報告する。