メッセージの直列化

直列化とは

直列化(serialize, marshal)とは、ランダムアクセス可能なメモリ空間に配置されているデータを、一次元順序の形に変換することである。

プログラムの扱うデータはメモリ上に不連続に配置されているのに対し、ネットワークI/Oはシーケンシャルである。 このため、データをネットワークへ書きだす場合にはデータ表現を変換しなければならない。

仮にデータがメモリ上で連続的に配置されている場合でも、そのメモリ上での表現形式は環境によって異なる。これらの差異をもたらすものには、PUのバイトオーダー、メモリアクセスの基本単位、構造体のパディング指定といったものがある。

これらの差異を吸収できるよう、異機種間でデータの相互通信を行う際は直列化時のデータ表現形式を厳密に定める必要がある。

nine の「直列化機能」

直列化関数を直接書くこともできるが、この方法ではバグが起きやすい。 さらに直列化のためのプログラムコードは、画一的である上に量が多くなりがちである。

これらの問題に対処するため、nine では直列化のための記述を一元的かつ簡潔に行うことのできる機能を提供している。 このドキュメントでは、直列化そのものに周辺機能を合わせたものを nine の直列化機能と総称している。

IDLとIDLコンパイラ

通信ソフトウェアでは、データをやり取りする際に直列化を行う必要がある。 当然のことながら、直列化及び復元の機能はプログラム中に実装する必要がある。

さらに、開発途上ではデータやプロトコルの変更は必ず発生する。 データ定義者(プロトコル設計者)、クライアントプログラム開発者、サーバープログラム開発者同士でデータ変更情報を共有し、直列化実装を変更する必要がある。 さらに全ての通信プログラムで同時に更新しなければならない。 これらを完璧にこなすことは困難で、開発時に問題となりやすい。

これらの問題を解決するために、一般的に通信システムの開発では専用のデータ定義言語を用いている。 専用言語でデータやインターフェースを定義し、それをコンパイラにかけて各種プログラミング言語用のソースコードを生成する。 このような方法を用いることで、ネットワークプログラム開発時の困難を和らげることができる。

この専用言語は一般的に Interface Definition Language, 縮めて IDL という。 IDL で記述した定義を IDL コンパイラにかけて、それぞれのプログラミング言語用のコードを生成する、というのが一般的な開発手順になる。

nine では、nineml と Protocol Buffers という二つの IDL をサポートしている。Protocol Buffers は将来的に廃止の予定である。

nineml

ninemlは nineメッセージを定義するための言語であり、XML をベースにしたマークアップ言語となっている。

ninemlでは、メッセージのデータ構造のみを定義すれば良く、この定義を元に実際のメッセージクラスのソースコードを生成することができる。

さらに、C++, ActionScript3, JavaScript 言語用のソースコードを出力できるので、nine for Flashを使用してクライアントを開発する際にも同一の定義からサーバー・クライアント両方のメッセージクラスを生成することができる。

Protocol Buffers

Protocol Buffersは、Google 社が開発している直列化のための公開技術であり、nine の直列化に利用することができる。

nine では、C++ 生成コードのみの対応となっている。