サービス定義は,次のUAPからSPP.NET,またはSPPに対してサービス定義を使用してRPCを実行する場合に定義します。
サービス定義は,サービス定義のファイルとサービス定義が参照するデータ型定義のファイルから構成されます。この節では,サービス定義の定義方法の詳細について説明します。サービス定義を使用したRPCについては,マニュアル「TP1/Client for .NET Framework 使用の手引」を参照してください。
データ型定義とは,RPCでやり取りされる入力データや出力データの形式をメッセージ単位で定義するものです。
サービス定義から参照するデータ型定義ファイルは,次に示す形式で独立したファイルとして定義します。
struct データ型定義名称 {
データ型 メンバ名称[配列指定];
〔〔データ型 メンバ名称[配列指定];〕…〕
};
〔〔struct データ型定義名称 {
データ型 メンバ名称[配列指定];
〔〔データ型 メンバ名称[配列指定];〕…〕
};〕…〕
表3-4 データ型の変換規則と変換内容
データ型定義ファイルで定義されたデータ型 | データ型の説明 | カスタムレコードクラスで定義される.NET Frameworkのデータ型 | データ変換の内容 |
---|---|---|---|
char | 文字列 | System.String | charは.NET FrameworkのSystem.Stringに対応づけられます。カスタムレコードを入力データとして使用する場合,スタブ生成コマンドに指定したエンコード方式に従ってバイト配列に変換しデータを扱います。 バイト配列に変換した結果が32バイトで,データ型定義がchar a[30]の場合,2バイトは破棄されます。 |
int | 32ビット符号付き整数 | System.Int32 | intは.NET FrameworkのSystem.Int32に対応づけられます。 カスタムレコードを入力データとして使用する場合,スタブ生成コマンドに指定されたエンディアンでバイト配列に変換して,RPCの要求メッセージに設定します。 カスタムレコードを出力データとして使用する場合,応答メッセージから4バイトをスタブ生成コマンドに指定されたエンディアンで読み込み,データにセットします。 |
short | 16ビット符号付き整数 | System.Int16 | shortは.NET FrameworkのSystem.Int16に対応づけられます。カスタムレコードを入力データとして使用する場合,指定されたエンディアンでバイト配列に変換して,RPCの要求メッセージに設定します。 カスタムレコードを出力データとして使用する場合,RPCの応答メッセージから2バイトをスタブ生成コマンドに指定されたエンディアンで読み込み,データにセットします。 |
long | 32ビット符号付き整数 | System.Int32 | longは.NET FrameworkのSystem.Int32に対応づけられます。 カスタムレコードを入力データとして使用する場合,スタブ生成コマンドに指定されたエンディアンでバイト配列に変換して,RPCの要求メッセージに設定します。 カスタムレコードを出力データとして使用する場合,応答メッセージから4バイトをスタブ生成コマンドに指定されたエンディアンで読み込み,データにセットします。 |
byte | バイナリデータ | System.Byte | byteは.NET FrameworkのSystem.Byteにマッピングします。 一次元配列指定にだけ使用できます。 |
struct | 構造体 | class(インナークラス) | データ型定義でstructとして定義されるデータ型のことを構造体と呼びます。 structはインナークラスに対応づけられます。 |
struct 構造体名称 {
データ型 メンバ名称[配列指定];
〔〔データ型 メンバ名称[配列指定];〕…〕
} メンバ名称[配列指定];
[配列要素数]
[配列要素数][配列要素数]
struct in_data {
long I_basho[3];
long I_kakaku;
long I_tokuchou;
};
struct out_data {
char o_name[20];
char o_basho[16];
char o_tokuchou[20];
long o_kakaku;
char o_inf[80];
};
struct out_data2 {
char o_name[20];
char o_basho[16];
char o_tokuchou[20];
long o_kakaku;
char o_inf[80][20];
};
struct put_data {
int o_num;
struct data {
char o_name[20];
char o_basho[16];
char o_tokuchou[20];
long o_kakaku;
char o_inf[80];
} data_t[100];
};
バウンダリ調整とは,データ型定義の各変数を決められたバイト境界に配置することをいいます。バウンダリ調整は,コンパイラが自動的に行います。
例えば,次に示すような構造体を使用している場合,先頭からのオフセットを正しくするため,実際はOS,およびコンパイラによって,dataとnumの間に1バイトの補正が入ります。
struct s_data {
char data[3];
long num;
} s_data_t
struct s_data {
char data[3];
<1バイト>
long num;
} s_data_t
この例の場合には,次のように修正して使用してください。
struct s_data {
char data[3];
long num;
} s_data_t;
struct s_data {
char data[3];
char wk;
long num;
} s_data_t;
データ型がstructで,配列型の場合は,可変長構造体配列として扱えます。可変長構造体配列は次に示す形式で定義します。
int 配列要素数を示すメンバ名称
struct 構造体名称 {
データ型 メンバ名称[配列指定];
〔〔データ型 メンバ名称[配列指定];〕…〕
} メンバ名称[配列要素数を示すメンバ名称:配列の最大要素数];
可変長構造体配列を指定する場合は,可変長構造体配列の配列要素数を「データ型がint型の配列要素数を示すメンバ名称:配列の最大要素数」という形式で記述します。構造体名称,データ型,メンバ名称および配列指定については,「(b) 説明」を参照してください。
struct put_data {
int o_num;
struct data{
char o_name[20];
char o_basho[16];
char o_tokuchou[20];
long o_kakaku;
char o_inf[80];
} data_t[o_num:100];
};
可変長構造体配列を使用する場合は,次の点に注意してください。
サービス定義とは,サービスの入出力データに対応するデータ型定義を定義するものです。
サービス定義ファイルは,次に示す形式で独立したファイルとして定義します。
#include "データ型定義ファイル名"
〔〔#include "データ型定義ファイル名"〕
…〕
interface サービス定義名称 {
サービス名称(入力データ型定義名, 出力データ型定義名);
〔〔サービス名称(入力データ型定義名, 出力データ型定義名);〕…〕
}
#include "mydata.h"
/* 業務1のサービス定義 */
interface GYOUMU1 {
GETDATA1(in_data, out_data);
GETDATA2(in_data, out_data2);
}
#include "datas/mydata.h"
/* 業務2のサービス定義 */
interface GYOUMU2 {
GET_DATA1(in_data, out_data);
PUT_DATA1(put_data, DC_NODATA); /* 非応答型 */
}
struct in_data {
long I_basho[3];
long I_kakaku;
};
struct out_data {
char o_name[20];
char o_basho[16];
long o_kakaku;
char o_inf[80];
};
struct out_data2 {
char o_name[20];
char o_basho[16];
long o_kakaku;
char o_inf[80][20];
};
struct put_data {
int o_num;
struct data {
char o_name[20];
char o_basho[16];
long o_kakaku;
char o_inf[80];
} data_t[100];
};
クライアントスタブ生成コマンド(spp2cstub)で-Xオプションを指定して,サービス定義からクライアントスタブを生成すると,引数および戻り値がXmlDocumentクラス(System.Xml.XmlDocument)となるサービスメソッドがクライアントスタブに追加されます。サービスメソッドの引数および戻り値のXmlDocumentクラスに指定できるXMLの形式は,クライアントスタブと一緒に生成される入力データ用XMLスキーマおよび出力データ用XMLスキーマで定義されます。
データ型定義の内容を基にして,次の図のように入力データ用XMLスキーマおよび出力データ用XMLスキーマに定義されます。入力データ用XMLスキーマのファイル名は,「〈対応する入力データ型定義名称〉.xsd」となり,出力データ用XMLスキーマのファイル名は,「〈対応する出力データ型定義名称〉.xsd」となります。
クライアントスタブ生成コマンド(spp2cstub)によって出力されるXMLスキーマは,XMLスキーマ仕様「XML Schema Definition language(XSD)1.0」に従います。なお,名前空間URIとして「http://www.w3.org/2001/XMLSchema」が指定されます。
図3-2 サービス定義,データ型定義,およびサービスメソッド用スキーマの関係