在需要对不同WEB系统之间进行跨语言、跨系统、跨平台的复杂的数据交互和共享,我们可以使用WDDX,它是一种基于XML的WEB分布式数据交互技术,这样就更能提高WEB站点的整体价值和方便构建强大的WEB系统。

下面先简要解释一下WDDX的交互原理

WDDX是通过“XML中间件”来实现数据交互。在WEB的各式各样的开发环境(PHP、ASP.net、Java等)都提供数据库支持,都有自己的数据结构,而WDDX为每个语言都提供 了一些模块,而这些模块能将这些数据结构转换成一种基于XML所描述的数据结构,即对这些数据进行序列化,反之,也可以把这些序列化的数据转换为某个语言的数据结构,也即是反序列化。在序列化和反序列化都是对数据进行无损转换。同时,由于所有的XML处理和交互过程都转移至WDDX模块中,开发者就不必再对XML文档本身进行编程和处理,从而使得这种语言之间的转换过程对于开发者来说就更加透明。

WDDX是由两个部分组成:

1. 第一部分是根据XML 1.0规范制定的一种独立语言的数据描述。依据规范,WDDX支持的数据类型有布尔型(boolean)、 数字型(number)、 日期型(date-time) 和字符串型(string)这些基本数据类型。此外WDDX还支持下列复杂数据类型:数组(array)、 结构(structure)和记录集(recordset)。其中,数组可以是用整数标引的任意类型对象的集合,结构可以是用字符串标引的任意类型对象的集合,记录集则是对数据的列表型封装。记录集中只允许有基本数据类型。

2. 第二部分就是为那些使用WDDX的语言所编制的模块集合。这些语言包括PHP 、Java、ASP.net、Python、ActiveX、COM、Perl等。另外,WDDX不仅仅适用于Web应用,将WDDX同COM相结合,开发人员甚至可以在任意一种流行的Windows应用开发环境下(包括Visual Basic,Delphi,PowerBuilder,C++和Java)用WDDX进行分布式数据开发。

下面是一个WDDX的范例:

</wddxpacket version=”1.0″>

PHP


3.1415926

a
b
c

</array length=”3″></var name=”cities”></var name=”pi”>
下面介绍一下WDDX的应用

使用WDDX主要包括数据序列化、WDDX包创建、数据反序列化三个步骤,通过调用相关函数实现。WDDX为不同的应用开发语言提供了不同的相关函数,为了简化,这里以利用WDDX在两个不同服务器上的PHP脚本之间传递复杂的数据结构为例,简要说明WDDX的使用。

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);返回值: 混合类型资料

$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);