WDDX による Web 上での複合データの移動

注意:

アドビでは 2020年12月31日をもって Flash Player のサポートを終了します。2021年1月12日以降は Flash Player で Flash コンテンツが動作しなくなるので、システムを保護するためにすべてのユーザーが Flash Player を直ちにアンインストールすることを強くお勧めします。 

詳しくは、Adobe Flash Player サポート終了情報ページを参照してください。

WDDX は、配列、連想配列(ColdFusion 構造体など)、レコードセットなどの複合データ構造体を一般的な方法で記述するための XML 語彙です。これによって、異なるアプリケーションサーバープラットフォーム間や、アプリケーションサーバーとブラウザー間で、HTTP を使用してデータを移動できます。WDDX のターゲットプラットフォームには、ColdFusion、ASP(Active Server Pages)、JavaScript、Perl、Java、Python、COM、Flash、PHP などがあります。
WDDX の XML 語彙は、標準データタイプの構造を記述した DTD(文書型定義)と、各ターゲットプラットフォームで次の処理を行うための一連のコンポーネントから構成されています。

  • シリアル化:ネイティブ形式で表現されたデータを、WDDX XML ドキュメントまたはドキュメントの一部に変換します。
  • シリアル化解除:WDDX XML ドキュメントまたはドキュメントの一部を、ネイティブなデータ表現(CFML 構造体など)に変換します。
    この XML 語彙によって、データ、データに関連付けられているデータタイプ、データをターゲットシステム上で操作するための記述子を任意のアプリケーションサーバー間で移動することができます。


軽量です。データのシリアル化およびシリアル化解除に使用する JavaScript(WDDX データをダンプするデバッグ関数を含む)は 22 KB 以下です。WDDX は、ColdFusion 開発者にとって便利なツールですが、CFML 以外の用途にも活用できます。一般的なプログラミングデータ構造(配列、レコードセット、構造体など)を WDDX 形式にシリアル化すれば、言語やプラットフォームの範囲を超えて、HTTP でデータを転送することができます。また、複合データをデータベース、ファイル、クライアント変数に保存することもできます。
WDDX には、Web 環境でのデータ転送に適した 2 つの特長があります。

  • 従来のクライアント / サーバー型アプローチとは異なり、ソースシステムとターゲットシステムの間で、互いのことを理解する必要はほとんどありません。理解する必要があるのは、転送するデータの構造だけです。
    WDDX は 1998 年に開発されましたが、現在では、多くのアプリケーションが WDDX 機能を備えています。

WDDX の用途

WDDX は、アプリケーション間で複合データを転送するときに役立ちます。例えば、CFML アプリケーションと CGI または PHP アプリケーションの間でデータをやり取りする場合に使用できます。また、サーバーとクライアントサイド JavaScript の間でデータを転送する場合にも役立ちます。

アプリケーションサーバー間でのデータ交換

WDDX は、異なるアプリケーションサーバープラットフォーム間で、構造化された複合データをシームレスに転送する場合に役立ちます。例えば、ある企業の ColdFusion ベースのアプリケーションで、 cfwddx  を使用して発注書を WDDX に変換した後、CGI ベースのシステムを使用しているサプライヤーに cfhttp  で送信するといったことができます。
サプライヤは、WDDX のシリアル化を解除してネイティブのデータ形式に変換し、注文書から情報を抽出して、ASP ベースのアプリケーションを使用している配送業者に渡すことができます。

サーバーとブラウザー間でのデータ転送

WDDX を使用して、サーバーとブラウザーの間でデータを転送することができます。サーバーデータを WDDX 形式に変換してブラウザーに送信し、ブラウザーで JavaScript オブジェクトに変換できます。同様に、ブラウザー上の JavaScript データをアプリケーションページでシリアル化して WDDX 形式に変換し、アプリケーションサーバーに送信できます。サーバーでは WDDX XML のシリアル化を解除して CFML データに変換できます。 
サーバー上で cfwddx タグを使用して、WDDX データのシリアル化およびシリアル化解除をおこないます。ブラウザー上で JavaScript データをシリアル化して WDDX に変換するには、JavaScript ユーティリティクラスの WddxSerializer および WddxRecordset を使用します。これらのユーティリティクラスは、サーバー上の webroot/CFIDE/scripts/wddx.js にインストールされています。

WDDX と Web サービス

WDDX は Web サービスと競合するものではありません。WDDX は、アプリケーションの統合に関する問題に特化した補完技術であり、Web 上で安価に実用的かつ生産的な方法でデータを共有するための方法を提供します。
WDDX には、次の利点があります。

  • ブラウザーや Flash Player などの軽量なクライアントで使用できます。
  • 複雑なデータ構造をファイルやデータベースに保管できます。
    WDDX を利用したアプリケーションでは、Web サービスを使用することになっても、WDDX を使用し続けることができます。また、そうしたアプリケーションを変換して、Web サービス標準のみを使用するようにすることもできます。その場合でも、サービスおよびデータ交換形式は変更が必要ですが、アプリケーションモデルを変更する必要はありません。

WDDX の仕組み

次の例で、WDDX の仕組みを示します。2 つの文字列変数を含んだ単純な構造体をシリアル化して WDDX XML 表現に変換すると、例えば次のような形式になります。

<struct>

<var name='a'>
<string>Property a</string>
</var>
<var name='b'>
<string>Property b</string>
</var>
</struct>
</var>

この XML のシリアル化を解除して CFML または JavaScript に変換すると、次のスクリプトで生成されるのと同じ構造体が作成されます。

JavaScript

CFScript

x = new Object(); x.a = "Property a"; x.b = "Property b";

x = structNew(); x.a = "Property a"; x.b = "Property b";

逆に、これらのスクリプトによって生成される変数をシリアル化して WDDX に変換すると、前述の XML が生成されます。
ColdFusion には、CFML、WDDX、および JavaScript の間で変換を行うためのタグおよび JavaScript オブジェクトが用意されています。他のデータ形式のシリアル化および シリアル化解除は、 Web 上で提供されています。

注意: cfwddx タグおよび wddx.js の JavaScript 関数では、データの表現に UTF-8 エンコーディングを使用しています。ColdFusion によって生成された WDDX のシリアル化を解除するツールでは、UTF-8 でエンコードされた文字を処理できる必要があります。UTF-8 エンコードは、128 個の標準の「7 ビット」ASCII 文字については、ASCII および ISO 8859 のシングルバイトエンコードと同一です。ただし、最上位ビットが 1 である「high-ASCII」ISO 8859 文字は、UTF-8 では 2 バイト文字で表現されます。

WDDX でのデータ型のサポート

次に、WDDX でサポートされているデータ型について説明します。この情報は、WDDX DTD の説明からの抜粋です。

基本データ型

WDDX では、次の基本データ型を表現できます。

データ型

説明

Null

Null WDDX の値は、 数値 や文字列などの型には関連付けられません。cfwddx タグでは、WDDX の Null 値は空の文字列に変換されます。

数値

WDDX ドキュメントでは、浮動小数点数によってすべての数値が表現されます。数値の範囲は、±1.7E±308 に制限されています。精度は小数点以下 15 桁です。

日付時刻値

日付時刻値は、ISO8601 の完全な形式に基づいてエンコードされます。例えば、2002-9-15T09:05:32+4:0 のようになります。

文字列

文字列 の長さに制限はありませんが、null を含むことはできません。文字列は、2 バイト文字を使用してエンコードできます。

複合データ型

WDDX では次の複合データ型を表現できます。

データ型

説明

配列

配列は、任意の型のオブジェクトのコレクションで、整数インデックスが付いています。多くの言語の配列インデックスは 0 から始まりますが、CFML の配列インデックスは 1 から始まります。したがって、配列インデックスを使用するとデータの互換性がなくなる可能性があります。

構造体

構造体は、任意の型のオブジェクトのコレクションで、文字列インデックスが付いています。連想配列とも呼ばれます。WDDX でサポートされている言語の中には大文字と小文字が区別されないものもあるので、構造体内の変数名を大文字と小文字の違いのみで区別することはできません。

レコードセット

レコードセットは、ColdFusion のクエリオブジェクトに対応する、名前付きフィールドのテーブル列です。レコードセットに保管できるのは、単純データ型のみです。WDDX でサポートされている言語の中には大文字と小文字が区別されないものもあるので、レコードセット内のフィールド名を大文字と小文字の違いのみで区別することはできません。フィールド名は、正規表現 [_A-Za-z][_.0-9A-Za-z]* の条件を満たす必要があります。この正規表現に含まれるピリオド(.)は、「任意の文字」ではなく、ピリオド文字そのものを意味しています。

バイナリ

バイナリは、バイナリデータの文字列(blob)を表します。データは MIME base64 形式でエンコードされます。

データ型の比較

次の表に、WDDX の基本データ型と、Web で広く使用されている言語や技術のデータ型の比較を示します。

WDDX

CFML

XML Schema

Java

ECMAScript/JavaScript

COM

null

N/A

N/A

null

null

VT_NULL

boolean

ブール値

boolean

java.lang.Boolean

ブール値

VT_BOOL

number

数値

number

java.lang.Double

数値

VT_R8

dateTime

日付時刻値

dateTime

java.lang.Date

日付

VT_DATE

string

文字列

string

java.lang.String

文字列

VT_BSTR

array

配列

N/A

java.lang.Vector

配列

VT_ARRAY | VT_VARIANT

struct

構造体

N/A

java.lang.Hashtable

オブジェクト

IWDDXStruct

recordset

Query オブジェクト

N/A

coldfusion.runtime.QueryTable

WddxRecordset

IWDDXRecordset

binary

バイナリ

binary

byte []

WddxBinary

V_ARRAY | UI1

タイムゾーンの処理

WDDX パケットの作成者と利用者が地理的に離れた場所にいることもあります。したがって、データのシリアル化やシリアル化解除を行う場合は、タイムゾーン情報を使用して、日付時刻値を正しく処理することが重要です。
日付時刻データをシリアル化するときにタイムゾーン情報を使用するかどうかは、cfwddx action=cfml2wddx タグの useTimezoneInfo 属性で指定します。JavaScript 実装の場合、useTimezoneInfo は WddxSerializer オブジェクトのプロパティです。いずれの場合も、useTimezoneInfo のデフォルト値は True です。
WDDX の日付時刻値は、ISO8601 形式のサブセットを使用して表します。タイムゾーン情報は、UTC(Universal Time:協定世界時)に対するオフセットの時間を、「2002-9-8T12:6:26-4:0」のように表現します。
cfwddx  タグで WDDX をシリアル化解除して CFML に変換する場合は、使用可能なタイムゾーン 情報が自動的に使用されて、 ローカルの日付時刻値に変換されます。したがって、タイムゾーン変換の詳細を気にかける必要はありません。
ただし、ColdFusion に用意されている JavaScript オブジェクトで WDDX のシリアル化を解除して JavaScript 表現に変換する場合は、タイムゾーン 情報が使用されません。 これは、JavaScript ではブラウザーのタイムゾーンを取得するのが困難なためです。

ヘルプをすばやく簡単に入手

新規ユーザーの場合

Adobe MAX 2025

Adobe MAX Japan
クリエイターの祭典

2025 年 2 月 13 日
東京ビッグサイト