一、WDDX的产生
WDDX,英文全称为Web Distributed DataExchange,是一种基于XML的Web分布式数据交换技术。WDDX最早是美国Allaire公司的程序技术设计师SimeonSimeonov为了解决ColdFusion中涉及到的分布计算问题而建立的。随着工作的开展,WDDX逐渐演变成为一种可用于不同的应用环境中交换复杂的结构化数据的数据交换技术。应用WDDX,不同的Web系统之间可以方便地进行跨语言、跨系统、跨平台的复杂数据的交换与共享,对于提高Web站点的整体价值以及协助Web开发人员更加方便地构建Web系统有着重要的应用意义。
二、WDDX工作机理及组成
简单地说,WDDX是通过在不同应用环境下的结构化数据之间建立一个"交换桥梁"---“XML中间件”完成数据交换的。因为几乎所有Web领域标准的开发环境(如ColdFusion, Perl, ASP, Java, #,PHP等)都包含有自己内在的数据结构,所以WDDX为每一种语言提供了一些模块.这些模块既可以自动地将这些内在的数据结构翻译成一种精炼的基于XML的描述,即序列化(serialized);同样也可以将基于XML的描述转换为某种语言环境下的数据结构,即反序列化(deserialized)。这样,两个不同应用环境下的结构化数据通过基于XML的描述所构成的中间件实现交换或者共享。比如,WDDX程序员可以在ColdFusion中获取一个复杂数组的值,通过WDDX相应模块将其序列化成为XML所描述的数据结构,然后将其发送给ASP服务器,最后再通过WDDX模块将该XML所描述的数据结构反序列化转换成一个VBScript的数组对象,而原先的所有数据类型都被无损转换。同时,由于所有的XML处理和交互过程都转移至WDDX模块中,开发者就不必再对XML文档本身进行编程和处理,从而使得这种语言之间的转换过程对于开发者来说就更加透明。
WDDX由两大部分组成:
第一部分是根据XML 1.0规范制定的一种独立语言的数据描述。依据规范,WDDX支持的数据类型有布尔型(boolean)、 数字型(number)、 日期型(date-time) 和字符串型(string)这些基本数据类型。此外WDDX还支持下列复杂数据类型:数组(array)、 结构(structure)和记录集(recordset)。其中,数组可以是用整数标引的任意类型对象的集合,结构可以是用字符串标引的任意类型对象的集合,记录集则是对数据的列表型封装。记录集中只允许有基本数据类型。
第二部分就是为那些使用WDDX的语言所编制的模块集合。这些语言包括ColdFusion、Java、ASP、#、PHP、Python、ActiveX、COM、Perl等。另外,WDDX不仅仅适用于Web应用,将WDDX同COM相结合,开发人员甚至可以在任意一种流行的Windows应用开发环境下(包括VisualBasic,Delphi,PowerBuilder,C++和Java)用WDDX进行分布式数据开发。
结构实例:
- <wddxPacket version="1.0">
- <header>
- <comment>PHP</comment>
- </header>
- <data>
- <struct>
- <var name="pi">
- <number>3.1415926</number>
- </var>
- <var name="cities">
- <array length="3">
- <string>a</string>
- <string>b</string>
- <string>c</string>
- </array>
- </var>
- </struct>
- </data>
- </wddxPacket>
三、WDDX应用示例
与WDDX工作机理相对应,使用WDDX主要包括数据序列化、包创建、数据反序列化三个步骤,通过调用相关函数实现。WDDX为不同的应用开发语言提供了不同的相关函数,为了简化,这里以利用WDDX在两个不同服务器上的PHP脚本之间传递复杂的数据结构为例,简要说明WDDX的使用。
1、PHP中的WDDX函数
wddx_packet_start():创建一个新的WDDX包,返回一个包标识。
语法: int wddx_packet_start(string [comment]);返回值: 整数
wddx_packet_end():结束一个指定的 WDDX包,并返回WDDX的字符串表示。参数 packet_id 为封包的标识代码。
语法: string wddx_packet_end(int packet_id);返回值: 字符串
wddx_serialize_value():生成一个单值的序列化表示,并创建一个新的WDDX包来包含该序列化的值,返回WDDX包的字符串表示。参数 var为将被序列化的值的内容。参数comment为在封包表头的字符串,可省略。。
语法: string wddx_serialize_value(mixed var, string [comment]);返回值: 字符串
wddx_serialize_vars():将多个数值序列化,并创建一个新的WDDX包来包含这一组序列化后的值,返回WDDX包的字符串表示。参数依次为将被序列化的值的内容。。
语法: string wddx_serialize_vars(string var_name | array var_names [, ... ] );返回值: 字符串
wddx_add_vars():用于增加一个或多个变量到使用wddx_packet_start()所创建的包中。若不成功则返回 false。
语法: boolean wddx_add_vars(int packet_id, ...);返回值: 布尔值
wddx_deserialize()/wddx_unserialize():将WDDX封包反序列化成分散资料,返回一个混合类型的变量,可以是字符串、数组等。如果 WDDX包包括超过一个的变量,一个相关数组将被返回,数组的键值将是序列化变量的名字。 参数 packet 为封包字符串。
语法: mixed wddx_deserialize(string packet);返回值: 混合类型资料
2、使用实例
- $pi = 3.1415926;
- $packet_id = wddx_packet_start("PHP");
- wddx_add_vars($packet_id, 'pi');
- $cities = array('a', 'b', 'c');
- wddx_add_vars($packet_id, 'cities');
- $packet = wddx_packet_end($packet_id);
- //header("Content-Type: text/xml");
- echo $packet; //输出WDDX字符串
- //解析WDDX字符串
- $t = wddx_deserialize($packet);
- var_dump($t);