Reflex Core Moduleの概要

Reflex Core Module

  1. XMLをストリーム形式で高速に処理できるXStream(http://xstream.codehaus.org/)を改良し、XMLのSerializer/deserializerとして使えるようにしています。
  2. JavaBeanのDtoやEntityなどのDataObjectやGoogle App EngineのJDOをXMLやJSONにシリアライズできます。また逆にXMLやJSONからJavaにデシリアライズできます。基本的にはJavaのプロパティが1対1にマッピングされます。
  3. xstreamのライブラリ、xstream-1.1.2.jar、およびプルパーサ xpp3-min1.1.3.4.RC8.jarに、当ライブラリを追加することで使用できるようになります。

jarファイル名/パッケージ名

reflexcore.jar / jp.sourceforge.reflex.core

maven2 pom.xml の repository および dependency

    <repository>
      <id>reflex.sourceforge.jp</id>
      <name>Reflex Sourceforge Repository</name>
      <url>http://reflex.sourceforge.jp/maven2</url>
    </repository>


    <dependency>
      <groupId>jp.sourceforge.reflex</groupId>
      <artifactId>reflexcore</artifactId>
      <version>1.2.2</version>
    </dependency>

機能拡張点

ReflexはオリジナルのXstreamを以下のように拡張しています。 (以降、クラス名、プロパティ名はJavaBeanのクラス名、プロパティのfield名を、要素名、属性、名前空間、QNAME、テキストノードはXMLのそれを指すこととします。)

  1. プロパティの先頭は大文字(Uppercase)、xmlの要素名の先頭はデフォルトでは小文字(Lowercase)となります。
  2. クラス名、プロパティ名がxmlのタグ(要素名)に対応します。また、プロパティのfieldはpublicだけが対象で、privateのものやgetter/setterなどのmethodは無視されます。また、public fieldでもfinal修飾子があるものは同様に無視されます。
  3. 子要素が複数のものをListとして扱えます。この場合、オリジナルではタグが重複して出力されていましたがReflexでは常に1つだけが出力されます。
  4. 属性の指定ができます。
  5. テキストノードの指定ができます。
  6. 名前空間の指定ができます。
  7. 複数のパッケージ名を同じ名前空間に指定できます。(v1.0)
  8. 同じクラス名であってもパッケージ名が異なれば違う要素として扱います。例えば、Listfoo.SampleとListbar.Sampleは区別されます。(v1.0)
  9. com.google.appengine.api.datastore.Text型をサポートしています。500文字以上になる場合はStringの代わりにText型を使用してください。(v1.0)
  10. JSONにおいてLong型およびlong型をサポートしています。(v1.1.12)

Javaの記述ルールと変換について

  1. シリアライズ(デシリアライズ)の対象となるプロパティはpublicでなければなりません。
  2. クラス名、プロパティ名が要素名を示します。階層構造を持つ場合の子要素名とその実体であるクラス名は一致していなければなりません。
  3. 要素名にハイフン(-)が含まれる場合はアンダースコア2つ(__)に変換されます。CaseSensitiveです。
  4. _$$nsプロパティをつけることで、クラス名に名前空間宣言を付けることができます。
  5. _$で始まるプロパティを先頭行から書くことでクラス名に属性を付けることができます。これは名前空間宣言を示す_$$nsプロパティの次の行でかつ要素名を示すプロパティの前の行に書く必要があります。
  6. プロパティ名に_$を付けることで属性となります。例えば、entry_$titleとすると、要素entryにtitleという属性が追加されます
  7. プロパティ名では要素名QNAMEの':'の代わりに'$'に置き換えたものになります。例えば、要素名のxmlns:atomはプロパティ名ではxmlns$atomとなります。ちなみに属性の場合はプロパティ名は_$xmlns$atomとなります。
  8. デフォルトの名前空間はJavaのパッケージ名に対応します。また、名前空間とパッケージ名をペアとするパラメータを複数個指定できます。
  9. テキストノードはプロパティ名を_$$textとします。(_$$で始まるものは予約語です)_$$textはどのプロパティより後ろの行になければなりません。
  10. Java5のGenericsをすることで、parent.child.・・.bar のように連結表記で記述できます。
  11. final修飾子のプロパティは無視されます。
  12. List以外のJavaのクラスでは、intなどのプリミティブ型の他、String、Dateなどを変換できます。Date型の場合は、ISO8601のタイムゾーン付きフォーマットになります。
  13. JSONにおけるハイフン、コロン、属性、テキストノード表現のサポート。(v1.2.2)

JSONにおけるハイフン、コロン、属性、テキストノードの表現

  • JSONでは、要素名の"-"が"__"に変換されるため"type_str-ing"は、"type_str__ing"となります。
  • XMLの名前空間で用いる”:”は、JSONでは"___"に変換されるため、"xml:atom"は、"xml___atom"となります。
  • XMLの属性は、JSONでは"要素名____属性名"プロパティとなるため、"attr1"は、JSONでは"type_str__ing____attr1"プロパティとして表現されます。
  • XMLのテキストノードは、JSONでは、"_______text"プロパティに変換されます。
    【XML(Type) シリアライズテスト】:
    <type xml:lang="ja">
      <type_str-ing attr1="属性1" attr2="属性2" xml:lang="jp">文字</type_str-ing>
      <type_int>1111</type_int>
      <type_long>2222222</type_long>
      <type_float>3333.33</type_float>
      <type_double>3333.33</type_double>
      <type_date>2009-09-03T11:33:21+0900</type_date>
      <type_Integer>6666</type_Integer>
      <type_Long>7777777</type_Long>
      <type_Float>8888.88</type_Float>
      <type_Double>8888.88</type_Double>
      <xml:atom>間にコロン</xml:atom>テキスト要素</type>
    
    上をXMLにデシリアライズ:
    <type xml:lang="ja">
      <type_str-ing attr1="属性1" attr2="属性2" xml:lang="jp">文字</type_str-ing>
      <type_int>1111</type_int>
      <type_long>2222222</type_long>
      <type_float>3333.33</type_float>
      <type_double>3333.33</type_double>
      <type_date>2009-09-03T11:33:21+0900</type_date>
      <type_Integer>6666</type_Integer>
      <type_Long>7777777</type_Long>
      <type_Float>8888.88</type_Float>
      <type_Double>8888.88</type_Double>
      <xml:atom>間にコロン</xml:atom>テキスト要素</type>
    
    【JSON(Type) シリアライズテスト】:
    {"type" : {"____xml___lang" : "ja","type_str__ing" : "文字","type_str__ing____attr1" : "属性1","type_str__ing____attr2" : "属性2","type_str__ing____xml___lang" : "jp","type_int" : 1111,"type_long" : 2222222,"type_float" : 3333.33,"type_double" : 3333.33,"type_date" : "2009-09-03T11\:33\:21+0900","type_Integer" : 6666,"type_Long" : 7777777,"type_Float" : 8888.88,"type_Double" : 8888.88,"xml___atom" : "間にコロン","_______text" : "テキスト要素"}}
    
    上をJSONにデシリアライズ:
    {"type" : {"____xml___lang" : "ja","type_str__ing" : "文字","type_str__ing____attr1" : "属性1","type_str__ing____attr2" : "属性2","type_str__ing____xml___lang" : "jp","type_int" : 1111,"type_long" : 2222222,"type_float" : 3333.33,"type_double" : 3333.33,"type_date" : "2009-09-03T11\:33\:21+0900","type_Integer" : 6666,"type_Long" : 7777777,"type_Float" : 8888.88,"type_Double" : 8888.88,"xml___atom" : "間にコロン","_______text" : "テキスト要素"}}