【実施例】
【0023】
図1は、本願発明による複数のバージョン間での変換処理の一例の概要を示す図である。
図1では、バージョン1と2の間、及び、2と3の間の変換処理を用意すればよく、バージョン1と3との間の変換処理はバージョン2を利用して行う。そのため、変換処理は、保存のために2つと回復のために2つを用意すればよい。
【0024】
具体的には、クラスには、バージョン1では、3つのメンバが含まれている。Code(string型)、Name(string型)及びPrice(int型)である。それぞれ、例えば、C123、ダッフルコートM、及び、50000である。
【0025】
バージョン2では、メンバColorを追加し、Codeに色コードとサイズを追加する。バージョン1から2への変換処理は、メンバColorを追加して「ネイビー」とすること、及び、メンバCodeへ、対応する色コード「2」及びNameから抽出したサイズ「M」を、ハイフンで追加することである。バージョン2から1への変換処理は、メンバColorの削除とコードからハイフン以降の削除である。
【0026】
バージョン3では、NameとColorをコロンで統合し、Colorを削除する。バージョン2から3への変換処理は、NameとColorをコロンで統合すること、及び、Colorを削除することである。バージョン3から2への変換処理は、Colorを追加し、Nameをコロンの前後で分離し、Colorをコロンの後のものにし、Nameからコロン以降を削除することである。
【0027】
以下では、ターゲット・クラスは、シリアライズ/デシリアライズ対象のユーザ定義クラスであり、最新のバージョン番号はN(Nは1以上の整数)とする。ターゲット・インスタンスは、ターゲット・クラスのインスタンスである。処理クラスは、ターゲット・クラスのシリアライズ/デシリアライズ処理用のクラスであり、過去の全てのバージョンに対して定義される。バージョン番号i(i=1, 2, ..., N)を持つ。これはシリアライズ/デシリアライズするメンバを含む。
【0028】
図2は、本願発明によるバージョンNとk(k<N)の間での保存/回復の処理の概要を示す図である。まず、前処理として、シリアライズのために、シリアライズ対象メンバを持つ旧バージョンのクラスなどを定義する。そして、ターゲット・インスタンスをシリアライズ用クラスへ変換し、最新版インスタンスからN−k回のバージョン・ダウン変換を行ってバージョンkのインスタンスを生成し、バージョンkのインスタンスへ保存/回復処理を行う。そして、N−k回のバージョン・アップ変換を行ってバージョンNのインスタンスを生成し、ターゲット・クラスへ変換してターゲット・インスタンスとする。これらの処理は、案件毎に人手で開発することは可能であるが、ソース・コードを自動的に生成することが望ましい。このとき、バージョン・アップ/ダウン時に各メンバ値の変換を行う部分はユーザ定義とし、その関数が存在すれば呼び出す。
【0029】
ターゲットのインスタンスと最新版(Verison.N)のインスタンスの変換処理について説明する。バージョン・ダウンのときは、Version.Nのインスタンスを生成し、Version.Nインスタンスの各メンバへターゲット・インスタンスの対応するメンバへのポインタを設定する。バージョン・アップのときは、Version.Nのインスタンスを破棄する。ターゲット・クラスのシリアライズ/デシリアライズする全てのメンバは最新版(Vesrion.N)のメンバと対応している。各メンバのアドレスをVersion.Nへ渡す場合、旧バージョンの対応するメンバが回復された時点で、ターゲットのメンバに直接値が設定されており、アドレス渡しの場合、特にするべき処理がなく、Version.Nのインスタンス(各メンバのアドレスを保持している。)を破棄するのみである。なお、コピーの場合は、対応するメンバのコピーを行った上でVersion.Nを破棄する。例えば、バージョン・ダウン処理はVersion.iのコンストラクタから呼び出し、バージョン・アップ処理はVersion.iのデストラクタから呼び出すことにより実現することができる。
【0030】
各バージョン間(Version.i+1とVersion.i)のインスタンスの変換処理(隣接バージョン間のインスタンスの変換処理)について説明する。バージョン・ダウンのときは、ユーザが定義したバージョン・ダウン変換関数があるときは、それを呼び出す。ないときは、Version.iのインスタンスを生成し、Version.iインスタンスの各メンバへポインタを設定する。具体的には、Version.i+1インスタンスに対応するメンバがある場合は、そこへのポインタを設定する。ない場合は、Version.iクラス内に該当変数の型の記憶領域を設けておき、バージョン・ダウン処理時に初期化する。Version.iの該当メンバへ、そこへのポインタを設定する。バージョン・アップのときは、ユーザが定義したバージョン・アップ変換関数がある時はそれを呼び出す。ないときは、Version.iのインスタンスを破棄する。
【0031】
各メンバの対応について、Version.iとVersion.i-1間で同じメンバの名前を変更し型を変更していない場合は、ユーザ(プログラマ)による指定によって名前変更前と後のメンバを対応づけ、そうでない場合は、同じ名前、かつ、同じ型のメンバ同士が対応するものとする。
【0032】
Version.iの保存/回復処理について、Version.iインスタンスの各メンバが指す記憶領域を保存/回復する。保存/回復先は、Version.iシリアライズ・データである。この処理には、従来のシリアライザを用いることもできる。他方、シリアライズ用クラスへの変換やバージョン・ダウン変換、バージョン・アップ変換、ターゲット・クラスへの変換などは、従来のシリアライザのみでは実現することができない。
【0033】
なお、最新版のインスタンスを生成することは、省略することができる。また、保存時にはバージョン・アップの連鎖を、回復時にはバージョン・ダウンの連鎖を省略することができる。
【0034】
また、ターゲットと最新版のインスタンスの変換処理及び隣接バージョン間のインスタンスの変換処理では、ポインタを用いて伝達することに代えて、コピーで実現してもよい。このときは、バージョン・ダウン処理の最初に新バージョンから旧バージョンへコピーし、バージョン・アップ処理の最初で逆方向へコピーする。このとき、同様に、保存時のバージョン・アップ処理のコピー、回復時のバージョン・ダウン処理のコピーは省略することができる。
【0035】
なお、本願発明では、ユーザが作成したプログラムにおいて、一部又は全部のクラスの旧バージョンのデータ保存をしないものでもよい。旧バージョンのデータ保存がされないクラスについては、例えば、Version.iのインスタンスを生成してシリアライズ・データから回復する。その後、Version.i+1のインスタンスを生成し、Version.iの各メンバを対応するVersion.i+1のメンバへコピーする。これを繰り返し、ターゲット・クラスのインスタンスへ各メンバをコピーする。なお、Version.i, i+1等のインスタンスは各コピー完了後破棄する。
【0036】
バージョン管理について説明する。各クラスのバージョン(「クラス・バージョン」という。)とは別に、プログラム全体にグローバルなバージョン番号(「グローバル・バージョン」という。)を定める。クラス・バージョンが上がったものが一つでもあると、グローバル・バージョンが上がる。そして、バージョン管理テーブルは、グローバル・バージョンと各クラス・バージョンとの対応関係を管理するための表である。表1は、バージョン管理テーブルの一例を示す。バージョン管理テーブルを用いることで、グローバル・バージョンを指定するだけで、全てのクラスについて当時のクラス・バージョンを決定でき、旧バージョンの形式での保存/回復を実現できる。また、グローバル・バージョンをシリアライズ・データへ記録することで、各クラスのクラス・バージョンの記録が不要となる。
【0037】
更に、型チェックするためにクラス名をシリアライズ・データへ記録する場合がある。従来のシリアライザでは、このクラス名を変更することができなかった。本願発明によれば、シリアライズ・データ内のクラス名を、バージョン管理テーブルの指定グローバル・バージョンについて検索し、そのバージョンにおけるクラス名が、シリアライズ・データ内のクラス名と一致する全てのものの中に、現在回復しようとしているクラスが存在すれば型チェックOK、存在しなければ型チェックNGとできる。これにより、保存時のクラス名で比較できるため、バージョン管理テーブルと、当該クラスのクラス名を取り出す手法を用意することで、バージョン番号が異なればクラス名の変更を実現できる。
【0038】
【表1】
【0039】
また、クラスの各メンバ変数に対して、保存記録媒体を指定できるようにしてもよい。一部のメンバはある保存記録媒体に保存され、他のメンバは別の保存記録媒体に保存することができる。このとき、回復処理のときも、バージョン・ダウン処理を行うことが望ましい。保存先指定により一部のメンバが保存されていない保存記録媒体からの回復時、そのままではバージョン・アップ変換処理が当該メンバをアクセスできない。しかし、回復時もバージョン・ダウン処理を行うことで保存されていないメンバの値を最新版から生成できる。また、最新のターゲット・クラスのインスタンスが持つ情報を、旧バージョンが使用することができる。
【0040】
ただし、保存先指定により保存対象の一部のメンバのみを回復し、かつ、バージョン・ダウン変換後、値の回復なしに、バージョン・アップ変換したときに値が元に戻らない場合に備えて、回復されなかったメンバについて元の値へ戻す手段を用意する。例えば、バックアップしておき、値が回復されなかった、又は、バージョン・アップ変換で変更されなかったメンバはバックアップをリストアする。バージョンN以外のインスタンスではバージョン・ダウン変換後にバックアップする。バージョンNインスタンスは生成時にバックアップする。また、バージョン・ダウン変換前にバックアップしておき、戻ってきたときに値が(回復や修正がなく)変化していなければバックアップをリストアする。バージョン・ダウン変換を省略し、バージョン・アップ変換のみ実装する場合なども同様である。
【0041】
また、enum定義もバージョン変更されることは多い。従来、単にシンボルが増えるだけなら実現できるが、本願発明によって、同じシンボル名を異なる意味に使うこともできる。また、シリアライズ・データとクラス・メンバの対応付けはメンバIDと順序の2種類が用いられている。従来、順序対応の場合には順序変更できなかったが、本願発明によれば、バージョン番号変更により順序変更できる。
【0042】
また、あるクラスが他のクラスを含むとき、それらのクラスの間で、足並みを揃えてバージョン・アップ/ダウンできる仕組みを設けてもよい。これにより、含んでいるクラスの値を使ってバーション・アップ/ダウン処理を記述することができる。このような仕組みを設けない場合、含んでいるクラスのデータは最新版のデータとなり、バージョン・アップした当時の定義と異なっていた場合、そのバージョン・アップ/ダウン変換関数の修正が必要になる。
【0043】
また、プログラムを自動生成するときに、プログラム・ファイルに対する排他制御を行ってもよい。並列コンパイル時にプロクラム・ファイルを修正すると、同じファイルを用いて並列に実行されていたコンパイル動作がおかしくなる可能性があるためである。
【0044】
また、クラス・メンバの保存方式について、メンバ名対応と順序対応の切り替えができるようにしてもよい。これにより、プログラム変更に対応しやすくしたり、効率的なものとしたりすることができる。また、enum型の保存方法について、シンボル名(プログラム変更に対応しやすい)とシンボル値(効率的)を切り替えができるようにしてもよい。さらに、同じバージョン番号内でのenum型のシンボル名/シンボル値を変更できるようにしてもよい。これにより、バージョン番号を変えなくてもシンボル名や値を変更できる。また、キー付きコレクションとして、保存先指定でクラスを分割保存したとき、同じキーに属するクラス・データを同じクラス・インスタンスへ回復できるようにしてもよい。
【0045】
図3は、本願発明の実施の形態に係るシリアライズ・データ処理装置の構成の一例を示すブロック図である。シリアライズ・データ処理装置1は、ソース・プログラム記憶部3とバージョン管理テーブル記憶部5と、旧バージョン定義記憶部7と、インスタンス記憶部9と、シリアライズ・データ記憶部11と、ソース生成部15と、コンパイル部17と、シリアライズ処理部19を備える。なお、シリアライズ・データ処理装置は、従来のシリアライザによって実現されている処理も実行することができる。
【0046】
ソース・プログラム記憶部3は、ユーザが入力したソース・プログラムを記憶する。ソース・プログラムは、少なくとも、クラス・バージョン変換処理及びクラス定義を含む。
図3では、簡単のために、1つのクラスで、ユーザがバージョン・アップ/ダウン処理を定義している場合を例に説明する。最新バージョンはNであるとする。
図3を参照して、ソース・プログラム記憶部3が記憶するソース・プログラムは、クラス・バージョン変換部21と、処理定義部23を含む。
【0047】
クラス・バージョン変換部21は、クラス定義と保存・通信メンバの指定を含み、さらに、最大N−1個のバージョン・アップ関数部25
iと、最大N−1個のバージョン・ダウン関数部27
iを含む。バージョン・アップ関数部25
iは、バージョンiからバージョンi+1へ変換するための処理を定義する。バージョン・ダウン関数部27
iは、バージョンi+1からバージョンiへ変換するための処理を定義する。
図4(a)は、クラス・バージョン変換部21の一例であるソース・プログラムであり、ファイル名は「class.h」である。
【0048】
処理定義部23は、シリアライズ/デシリアライズ処理を定義するものであり、保存処理部29と、回復処理部31を含む。
図4(b)は、処理定義部23の一例であるソース・プログラムであり、ファイル名は「main.cpp」である。
【0049】
バージョン管理テーブル記憶部5は、表1を例に説明したバージョン管理テーブルを記憶する。
【0050】
ソース生成部15は、クラス・バージョンの更新に伴い、バージョン管理テーブルを更新する。また、ソース生成部15は、クラス・バージョン変換部21及び処理定義部23を用いて、保存/回復の処理を実現するためのソース・コードを自動生成する。旧バージョン定義記憶部7は、ソース生成部15が生成したソース・コードを記憶する。
図5(a)及び(b)は、
図4(a)及び(b)を用いて自動生成されたソース・コードの一例を示し、ファイル名は「main.cpp.theoride.hpp」である。
図5(b)のMyGVNT部分が、バージョン管理テーブルに当たる。
【0051】
コンパイル部17は、ソース・プログラム記憶部3、バージョン管理テーブル記憶部5及び旧バージョン定義記憶部7を参照して、ソース・コードをコンパイルする。ここで、シリアライズ制御ライブラリをリンクする。シリアライズ処理部19は、シリアライズ/デシリアライズ処理を行うものであり、コンパイル済みのプログラムを実行することにより実現される。
図6は、
図4及び
図5の例における(a)バージョン3、(b)バージョン2、及び、(c)バージョン1の出力を示す図である。main.cppには、THEORIDE_S_PROCESS()がある。
図6において、最初が(a)バージョン3、次が(b)バージョン2、3番目が(c)バージョン1のシリアライズである。最後がデシリアライズであり、(d)は、バージョン3のデシリアライズ結果を出力したものである。
【0052】
シリアライズ処理部19は、保存部41と、回復部43と、制御部45と、リピート制御部47と、バージョン・ダウン変換部49と、バージョン・アップ変換部51を備える。
図7〜9のフロー図を参照して、シリアライズ処理部19の動作の例を説明する。
【0053】
図7(a)を参照して、保存処理の一例を説明する。保存処理の開始時に、保存先を指定する。この保存先とメンバに指定された保存先が一致しているものについて保存される。なお、保存先を指定しなかった場合、保存対象のメンバは全て保存される。制御部45は、kを、保存対象のインスタンスバージョン番号とし(ステップSTS1)、型を判断する(ステップSTS2)。プリミティブ型(例えば、int型やdouble型等、基本的なデータ型)であれば、保存部41は、プリミティブ保存をし、処理を終了する。
【0054】
クラス型であれば、保存部41は、処理クラス・バージョンNのインスタンスを生成する(ステップSTS4)。具体的には、インスタンス生成後、ターゲット・クラスの各メンバを、処理用クラス・バージョンNの対応するメンバへ設定する。これは、値をコピーする方法とアドレスを設定する方法がある。このとき、同じメンバ名のメンバ同士を対応付ける。
【0055】
制御部45は、kがNと一致するか否かを判断する(ステップSTS5)。一致するのであれば、保存部41は処理用クラス・バージョンNのインスタンス保存をし(ステップSTS6)、ステップSTS13へ進む。
【0056】
ここで、インスタンス保存は、保存記録媒体へ保存する処理である。ステップSTS6及びSTS11では、保存対象のメンバを1つ1つ枚挙し、保存先が一致しているものについて、値を保存するためにシリアライズ処理を再帰的に呼ぶ。その際、シリアライズ・データ上のメンバがプログラム側のどのメンバへ回復するのか対応付けに必要な情報も保存する。対応方法は2種類ある。メンバID対応では、クラス内でユニークに定められたメンバ名、もしくは、番号にて対応する。そのため、メンバIDとメンバの値をペアでシリアライズ・データへ記録する。なお、メンバIDとメンバの値がシリアライズ・データ上で隣接する必要はなく、例えば、ヘッダにメンバIDを記録し、シリアライズ・データ側へはメンバIDを記録しないなどでもよい。順序対応では、クラス内で決められた順序に従って対応する。順序は、ソース・コード上でメンバを記述した順序やメンバ名の辞書順等である。
【0057】
一致しないのであれば、リピート制御部47は、iにN−1を代入する(ステップSTS7)。保存部41は、処理クラス・バージョンiのインスタンスを生成する(ステップSTS8)。バージョン・ダウン変換部49は、処理用クラス・バージョンi+1のインスタンス(Read Only)及び処理用クラス・バージョンiのインスタンス(Read/Write)を受け取り、保存対象のメンバに対してバージョン・ダウン変換処理を行う(ステップSTS9)。具体的には、バージョン・ダウン変換部49は、インスタンス生成後、処理用クラス・バージョンi+1の各メンバを、処理用クラス・バージョンiの対応するメンバへ設定する。これも、値をコピーする方法とアドレスを設定する方法がある。原則として、同じメンバ名のメンバ同士を対応付ける。もしメンバ名が変更されていたならば、ソース・コードの指定に従って対応付ける(後に具体例を使って説明する)。旧バージョン側に対応するメンバがない場合、対応しない。新バージョン側に対応するメンバがない場合、旧バージョン内にそのメンバ用のメモリ領域を確保し、予め決められた方法で初期化する(
図1のクラス・バージョン2でのColorに関する処理を参照)。予め決められた方法には、使用しているプログラミング言語が定める方法(デフォルト・コンストラクタ)、当該シリアライザが定める方法(固定値等)、ユーザ指定(ユーザ関数呼び出しやソース・コードへの指定)による方法がある。
【0058】
メンバ名が変更されており、ソース・コードの指定に従って対応付ける場合について、バージョン3のmUShortメンバの名前をバージョン4のmDataへ変更したときには、例えば、下記のような例となる。ここで、THEORIDE_S_ANNOTATEは、属性定義用マクロである。theorideSD::Configは、保存先指定である。なお、保存先指定は、省略することもでき、この場合、常に保存対象とする。
【0059】
struct IntrusiveDerived : public IntrusiveBase
{
unsigned int mUInt;
unsigned short mData THEORIDE_S_ANNOTATE(FS:mUShort<theorideSD::Config>);
IntrusiveBase mIntrusiveBase;
THEORIDE_S_INTRUSIVE(CS, (IntrusiveDerived), 4);
};
【0060】
制御部45は、kがNと一致するか否かを判断する(ステップSTS10)。一致するのであれば、保存部41は処理用クラス・バージョンiのインスタンスを保存し(ステップSTS11)、ステップSTS13へ進む。一致しないのであれば、リピート制御部47は、iを1減少し、ステップSTS8に戻る。
【0061】
ステップSTS13で、処理用クラス・バージョンk〜Nのインスタンスを全て破棄し、処理を終了する。
【0062】
図7(b)は、処理用クラス・バージョンNのインスタンスを生成しない場合の例を示す。
図7(a)と(b)は、基本的に同じであるが、
図7(a)のステップSTS4が省略され、
図7(b)のステップSTT5では、
図7(a)のステップSTS6と異なり、インスタンス破棄の処理は不要となる。
【0063】
図8を参照して、デシリアライズ処理の一例を説明する。まず、回復処理の開始時に、保存先を指定する。制御部45は、kを、保存対象のインスタンスバージョン番号とし(ステップSTD1)、型を判断する(ステップSTD2)。プリミティブ型であれば、回復部43はプリミティブ回復をし(ステップSTD3)、処理を終了する。
【0064】
ここで、インスタンス回復は、保存記録媒体から回復(デシリアライズ)することである。クラス型、かつ、メンバID対応の場合、回復対象のメンバを1つ1つ枚挙しつつ回復する。例えば、メンバIDが一致するものを回復する。また、保存先指定を無視せずに、メンバIDが一致し、かつ、保存先も一致するものを回復するようにしてもよい。例えば、クラス型、かつ、順序対応の場合、回復対象のメンバを1つ1つ枚挙しつつ、保存先が一致しているメンバの値を回復してもよい。枚挙は、例えば、保存時と同じ順序で行うことができる。
【0065】
クラス型であれば、処理クラス・バージョンNのインスタンスを生成する(ステップSTD4)。制御部45は、kとNが一致するか否かを判断する(ステップSTD5)。一致するならば、処理用クラス・バージョンNのインスタンスを回復し(ステップSTD6)、ステップSTD17に進む。一致しないならば、リピート制御部47は、iをN−1とする(ステップSTD7)。バージョン・ダウン変換部49は、処理クラス・バージョンiのインスタンスを生成する(ステップSTD8)。制御部45は、iとkが一致するか否かを判断する(ステップSTD9)。一致しないならば、リピート制御部47は、iを1減少し、ステップSTD8に戻る。一致するならば、回復部43は、処理クラス・バージョンiのインスタンスを回復する(ステップSTD11)。そして、処理用クラス・バージョンiからi+1へのインスタンス引き継ぎ処理を行う(ステップSTD12)。
【0066】
処理用クラス・バージョンiからi+1へのインスタンス引き継ぎ処理は、処理用クラス・バージョンiのインスタンス生成にてアドレスを設定している場合は、特に処理はない。値をコピーしている場合は、処理用クラス・バージョンiの各メンバを、処理用クラス・バージョンi+1の対応するメンバへコピーする。
【0067】
そして、バージョン・アップ変換部51は、処理用クラス・バージョンiのインスタンス(Read Only)及び処理用クラス・バージョンi+1のインスタンス(Read/Write)を受け取り、バージョン・アップ変換処理を行う(ステップSTD13)。処理用クラス・バージョンiのインスタンス破棄を行う(ステップSTD14)。リピート制御部47は、iを1増加する(ステップSTD15)。制御部45は、iとNが一致するか否かを判断する(ステップSTD16)。一致しないならば、ステップSTD12に戻る。一致するならば、ステップSTD17に進む。
【0068】
ステップSTD17で、回復部51は、処理用クラス・バージョンNのインスタンスを破棄する。処理用クラス・バージョンNのインスタンス生成にてアドレスを設定している場合は、特に処理はなし。値をコピーする方法を用いている時は、処理用クラス・バージョンNの各メンバを、ターゲット・クラスの対応するメンバへコピーする。その後、インスタンスを破棄する。
【0069】
処理用クラスのバージョンNを生成しない場合についても、同様に実現することができる。
【0070】
図9は、バージョン・ダウン処理を行わないでデシリアライズ処理を実現する場合の一例である。制御部45は、kを、保存対象のインスタンスバージョン番号とし(ステップSTE1)、型を判断する(ステップSTE2)。プリミティブ型であれば、回復部43は、インスタンス回復をし(ステップSTE3)、処理を終了する。
【0071】
クラス型であれば、リピート制御部47は、iをkとする(ステップSTE4)。回復部43は、処理用クラス・バージョンiのインスタンスを生成する(インスタンス生成のみ)(ステップSTE5)。回復部43は、処理用クラス・バージョンiのインスタンスを回復する(ステップSTE6)。制御部45は、iとNが一致するか否かを判断する(ステップSTE7)。
【0072】
一致しないならば、回復部43は、処理用クラス・バージョンi+1のインスタンスを生成し、処理用クラス・バージョンiの各メンバを処理用クラス・バージョンi+1の対応するメンバへコピーし(ステップSTE8)、バージョン・アップ変換処理を行い(ステップSTE9)、処理用クラス・バージョンiのインスタンスを破棄する(ステップSTE10)。制御部45は、iを1増加して、ステップSTE7に戻る。
【0073】
一致するならば、回復部43は、処理用クラス・バージョンNのインスタンスの各メンバを対応するターゲット・クラスのインスタンスの各メンバへコピーし(ステップSTE12)、処理用クラス・バージョンNのインスタンスを破棄して(ステップSTE13)、処理を終了する。
【0074】
現在のシリアライザは、1つのオブジェクト指向言語において、クラスの保存/回復(送信/受信)を容易にしてプログラム開発を支援するにすぎない。今後、複数のオブジェクト指向言語の間で、クラス定義の交換を可能にするシリアライザが登場するであろう。これは、いわば「メタ・シリアライザ」とも表現し得るものである。発明者は、本願発明が、メタ・シリアライザの実現にも貢献できるものと考える。例えば、プリミティブをプログラミング言語ではなくライブラリ等を用いて決めることで、プログラミング言語から独立してシリアライズ・データのフォーマットを決めることができる。例えば
図7〜9においてクラス型とプリミティブ型に関する処理が含まれることを利用してデータ交換を実現することができる。例えば文字列型をクラスとして提供するプログラミング言語であれば、
図7〜9においてクラス型とプリミティブ型に関する処理が含まれることを利用して文字列型をクラス型ではなくプリミティブ型として実装することにより、文字列型を直接提供するプログラミング言語とのデータ交換を可能とすることができる。