![]() |
赤紫蘇2.リファレンス |
||
概要 |
|||
akaxiso2.0-beta1 | |||
|
|||
赤紫蘇2は、C++のクラスをXML形式に、シリアライズ、デシリアライズするためのライブラリです。 また、STLベースで実装されており、XMLパーサ、エンコーディング変換エンジンもライブラリ内に含まれています。このため、他ライブラリへの依存性を気にする必要はありません。XMLパーサとしてXerces-C++を使用することも可能です。 シリアライザブルな値クラスは、ユーザにより定義され、XML-Schemaに準じたデータの構造をもつことができます。 シリアライザブルなクラスへの要請 以下の要請を満たすクラスが、(デ)シリアライズ可能です。
値クラスは、通常のクラスですが、クラスのメンバに対し、後述するXML型情報クラス(leafクラス)がアクセスできる必要があります。これ以外には、特別の制約はありません。これは、クラス定義の自由度を確保するためです。 赤紫蘇2は、シリアライザブルな値クラスを(デ)シリアライズするための機能を、二つの名前空間aka::、xiso::内に持っています。シリアライザブルな値クラスは、ユーザは、任意の名前空間内、もしくは、グローバル名前を空間中に定義することができます。ユーザ定義の値クラスをシリアライズするためのフレームワークが、aka::名前空間内に実装されています。 また、値クラスを(デ)シリアライズするためのXML型情報クラスを別個に定義します。このクラスをleafクラスと呼びます。通常は、xiso::名前空間内で定義します。値クラスのデータモデルの構造、タグ名とメンバや要素の対応、出現頻度などの型情報が、leafクラス内で定義されます。 aka::名前空間内には、シリアライザブルな値クラスと、XML型情報クラス(leafクラス)の二つのクラスを結び合わせ、クラスの値へのアクセスとタグ名の関連付け、データモデルの検証を行い、XML形式への変換、逆変換を行うための機能が実装されています。 簡単な定義の例 簡単な例として、以下のクラスfooを値クラスとして用いた場合の、(デ)シリアライズについて説明します。 struct foo { long value1_; long value2_; };上記のクラスが、 <?xml version="1.0"?> <foo> <value1>15</value1> <value2>20</value2> </foo> とシリアライズされるように、XML型情報クラス(以降 leafクラス)を定義します。 まず、要素が<value1>、<value2>と順に出力されますので、xs:sequence型に対応させます。この定義を行うためのleafクラスの定義を行います。 leafクラスの定義は、以下の二つのスタイルで行うことができます。
//宣言 namespace xiso { template<> struct leaf<foo> : aka::sequence<foo> { void model(); // 型定義メソッド }; //実装 void xiso::leaf<foo>::model() { member("value1", &foo::value1_); member("value2", &foo::value2_); }; struct leaf<foo>は、aka::sequence<>テンプレートを継承しており、データモデルをsequence型として処理します。void model()メソッド中で、タグ名とメンバを対応付けています。 赤紫蘇2では、leafクラスを定義するための名前空間として、namespace xiso を定義しています。スタイル1では、これを利用して定義を行っています。 namespace xiso { template<class T> struct leaf<T>; }; 上記のclass Tに、struct fooがテンプレート引数として与えられることにより、struct fooに対するleafクラスとして、xiso::leaf<foo>クラスが対応付けられます。
//宣言 struct foo_leaf : aka::sequence<foo, foo_leaf> { void model() { // 型定義用メソッド member("member1", &foo::member1); } }; //実装 void::model() { member("member1", &foo::member1_); } スタイル2では、namespace xisoを用いず、明示的に、leafクラスの型を指定しています。 このスタイルは、同じ型を二つ以上の形式でシリアライズする場合に必須となります。 leafクラスにおけるmodel()メソッドにより、以下の内容を定義します。
ドキュメントの宣言 ドキュメントの宣言は、aka::doctype()関数をもちいて、leafクラスとドキュメントのタグ名を対応付けることで行います。 たとえば、上述のfooクラスのドキュメントを宣言するには、以下のように行います。
aka::doctype("foo", xiso::leaf<foo>());
aka::doctype("foo", foo_leaf()); |