IBM®
跳转到主要内容
    中国 [选择]    使用条款
 
 
Select a scope: Search for:    
    首页    产品    服务与解决方案     支持与下载    个性化服务    
跳转到主要内容

developerWorks 中国  >  XML  >

developerWorks: XML在传统制造业供应链中的应用分析(四):

选择XML信息流传递的协议 第三部分

developerWorks
文档选项

未显示需要 JavaScript 的文档选项


级别: 初级

郭路, Technical Manager

2001 年 6 月 01 日

传递XML信息流的通信协议基本可分为两类:与XML无关及与XML有关的。当协议与XML无关时XML文档被视为一般的文本数据,因此可以与各种通用的网络通信方式结合。当协议与XML有关时,即传递数据的载体必须为XML格式,目前这样的协议有XML-RPC、SOAP、WDDX等,它们都属于应用层协议。由于第一类方法中,XML信息的处理与一般信息无二,即使用传统的网络通信方法即可,因此本文仅作简要介绍;而对第二类方法,本文将会逐一做较为详细的说明,并试图分析XML-RPC、SOAP、WDDX等协议之间的异同。

WDDX协议

WDDX,英文全称为Web Distributed Data Exchange(即基于Web的 分布式数据交换)。Allaire 发布WDDX的目的是用来解决在不同的Web应用之间传输关键数据。最初,Simeon Simeonov--Allaire的语言技术设计师之--创造了WDDX,用以解决 在ColdFusion中遇到的分布计算问题。到后来,这项工作则又进一步发展演变成为 一种跨语言的框架结构,并且最终导致了WDDX SDK和WDDX.org的诞生。WDDX的功能定位是为不同Web编程语言之间的数据交换建立一种简单的轻量级技术。WDDX包含两方面的内容,即:

  • 1) 独立于编程语言的XML数据描述标准;
  • 为不同编程语言定制的WDDX串行化(Serialize)与逆串行化(deserialize)开发包。

  • 注:创建一个应用数据的XML表示的处理过程被称之为做序列化(serialization)。从一个WDDX XML表示中实例化应用数据的处理过程叫做非序列化(deserialization)。


WDDX并不关心实际完成数据传递的底层通信协议,由于WDDX数据包采用了标准的XML格式,因此它广泛支持基于原文数据传输的协议,如HTTP、SMTP、POP、FTP等等。

WDDX数据包是标准的XML文档,其DTD描述如下:

<!ELEMENT wddxPacket (header, data)>
<!ATTLIST wddxPacket
version CDATA #FIXED "0.9">
<!ELEMENT header (comment?)>
<!ELEMENT comment (#PCDATA)>
<!ELEMENT data (boolean | number | dateTime | string | array | struct | recordset)*>
<!ELEMENT boolean EMPTY>
<!ATTLIST boolean
value (true | false) #REQUIRED>
<!ELEMENT string (#PCDATA | char)*>
<!ELEMENT char EMPTY>
<!ATTLIST char
code CDATA #REQUIRED>
<!ELEMENT number (#PCDATA)>
<!ELEMENT dateTime (#PCDATA)>
<!ELEMENT array (boolean | number | dateTime | string | array | struct | recordset)*>
<!ATTLIST array
length CDATA #REQUIRED>
<!ELEMENT struct (var*)>
<!ELEMENT var (boolean | number | dateTime | string | array | struct | recordset)>
<!ATTLIST var
name CDATA #REQUIRED>
<!ELEMENT recordset (field*)>
<!ATTLIST recordset
rowCount CDATA #REQUIRED
fieldNames CDATA #REQUIRED>
<!ELEMENT field (boolean | number | dateTime | string)*>
<!ATTLIST field
name CDATA #REQUIRED>

在WDDX中支持如下数据类型:

  • 简单数据类型:
  • 布尔型(Boolean):包括true、false两种选择。
  • 数字型(Numbers):用于表示浮点数,其取值范围为+/-1.7E+/-308,其最大精确度为小数点后的15位数。
  • 日期时间型(Date-time):其书写格式完全遵循ISO8601规范,例如:1998-9-15T09:05:32+4:0。注意当月、天、小时、分钟或秒的值为单数时无需在十位数上加0。为了避免千年虫问题,年份必须统一用四位数表示。
  • 字符串(String):字符串可以为任意长度,WDDX中字符串采用双字节的UTF-8编码格式,其取值范围为00到1F。需要注意的是,对于不同的编程语言及操作平台,字符串的行尾表示是不同的--可以是单个换行符(OA)、单个回车符(OD)、或单个回车符加单个换行符(ODOA)。在WDDX规范中,不支持回车符(OD),因此这三种不同格式的行尾在WDDX数据包中统一用单个换行符(OA)表示。
  • 复合数据类型:
  • 数组(Arrays):在WDDX中数组是一个以整数为索引的元素集,其元素类型为任何合法的数据类型。数组元素从0开始计数,唯一的例外是CFML(COldFusion标记语言),其数组元素从1开始计数。
  • 结构(Structures):在WDDX中结构是一个以字符串为索引的对象集,结构包含一个或多个变量。由于某些被WDDX支持的编程语言是大小写不敏感的。因此在WDDX中对变量不区分大小写,即两个不同变量名的表示不能仅仅用大小写区分。
  • 记录集(Recordsets):记录集是一系列具有相同字段的数据记录列表,记录集中仅允许存放简单类型的数据。由于某些被WDDX支持的编程语言是大小写不敏感的,因此在WDDX中对字段名不区分大小写,即两个不同字段名的表示不能仅仅用大小写区分。

注:在WDDX中没有专门的标记符用于表示NULL值,一个NULL值的对象被序列化(serialize)为空字符串。当在将空字符串逆序列化(deserialize)时由具体操作的应用决定是将其转化为NULL值还是空字符串。

以下是基于上述DTD及数据类型描述的一个WDDX数据包范例:

<?xml version='1.0'?>
<!DOCTYPE wddxPacket SYSTEM 'wddx_0090.dtd'>
<wddxPacket version='0.9'>
<header/>
<data>
<struct>
<var name='s'>
<string>a string</string>
</var>
<var name='n'>
<number>-12.456</number>
</var>
<var name='d'>
<dateTime>1998-06-12T04:32:12</dateTime>
</var>
<var name='b'>
<boolean value='true'/>
</var>
<var name='a'>
<array length='2'>
<number>10</number>
<string>second element</string>
</array>
</var>
<var name='obj'>
<struct>
<var name='s'>
<string>a string</string>
</var>
<var name='n'>
<number>-12.456</number>
</var>
</struct>
</var>
<var name='r'>
<recordset rowCount='2' fieldNames='NAME,AGE'>
<field name='NAME'>
<string>John Doe</string>
<string>Jane Doe</string>
</field>
<field name='AGE'>
<number>34</number>
<number>31</number>
</field>
</recordset>
</var>
</struct>
</data>
</wddxPacket>

上述WDDX数据包定义了一个具有六个变量的结构类型,其中:
  • 字符串变量s的值为'a string';
  • 数字变量n的值为-12.456;
  • 日期时间变量d的值为1998-06-12T04:32:12;
  • 布尔型变量b的值为true;
  • 数组变量a包括两个元素:第一个为数字型元素其值为10 ,第二个为字符串元素其值为'second element');
  • 结构型变量obj包含两个子变量:字符串变量s(其值为'a string')与数字型变量n(其值为-12.456);
  • 记录型变量r包含两个字段:NAME与AGE。


WDDX并不是一种正式的标准,也没有被提交 给W3C、IETF或其他标准组织。但这并不是说,WDDX没有利用价值。两个原因使其具有相当光明 的前景。第一,它是一种免费软件,可以被自由的使用和发布;第二,它基于开放、标准化的计算机技术,即XML。WDDX解决了在不同Web应用环境(如JavaScript, ColdFusion, Perl, ASP/COM和Java) 之间交换数据中的关键问题。有了WDDX,不同的应用可以方便地进行跨语言、跨系统、 跨平台的复杂数据共享。其结果是开发者能够更加方便地构建系统用于在浏览器和服务器 或者不同的应用服务器间交换数据。

目前,由Allaire开发的WDDX SDK已有如下几种版本:

  • ColdFusion:在ColdFusion
  • 4.0通过使用CFML标记对WDDX提供了充分支持,包括将任何CFML标记表示的数据类型转换为WDDX数据包(序列化)以及相反的数据转换处理(逆序列化),ColdFusion 4.0同样支持WDDX数据包与JavaScript数据之间的相互转换。
  • JavaScript:在JavaScript中通过文件wddx.js支持WDDX,该文件中包含了一个WDDX序列化功能模块和一个JavaScript记录集类型声明(JavaScript语言本身并不支持记录集类型),wddx.js中并不包含对WDDX逆序列化的支持,不过,目前已有第三方提供了基于XML Paser开发的WDDX JavaScript逆序列化工具包。
  • COM:通过一个轻量级的COM组件集实现对WDDX的支持,提供在COM数据类型与WDDX数据包之间的序列化与逆序列化功能。该COM组件同样支持WDDX与JavaScript数据之间的互相转换。通过该组件,任何支持COM对象的编程语言都可以实现对WDDX序列化与逆序列化的支持,包括:ASP、Visual Basic,Visual C++、C++ Builder、Delphi、PowerBuilder、等。
  • Perl and
  • Java:目前在Perl与Java语言中对WDDX的支持还没有完全实现,Perl可以serialize(连续化)但是还不能deserialize(非连续化)。而Java支持deserialize(非连续化)但不支持serialize(连续化)。
上述的各种WDDX SDK均可从 http://www.wddx.org/中下载。

一般来说,任何需要通过网络同其他应用共享数据的应用都可以利用WDDX来构建(前提其编程语言或应用环境必须支持WDDX)。比较典型的商业案例就是企业电子商务中对企业内部网和外部网应用,因为这些应用都存在企业需要发布数据,如产品信息、供应链数据、客户数据、订单数据等等。由于WDDX是语言独立并且是通过HTTP传送,因此开发者可以利用利用ColdFusion或者ASP构建应用,并且发布数据到支持WDDX的过程应用中。这些过程应用可以使用Perl,ColdFusion, ASP或者其它支持WDDX的语言来访问数据,这样一来,就消除了在使用不同语言环境的合作伙伴间共享数据所造成的开销和复杂度。

与XML-RPC和SOAP相比,WDDX更适用于纯粹的XML数据传输,如一个采购单,或一份财务报表,但却不能携带基于这些XML数据的方法处理。对于接收到的WDDX数据包,我们可以使用基于不同编程语言的WDDX开发包来进行逆序列化,也可以使用DOM或SAX编程接口直接对其进行处理。使用WDDX数据包传送XML数据有利于增强应用的扩展性与灵活性。与SOAP、XML-RPC相似,WDDX也不要求开发者必须懂得XML不同应用的开发者可以通过WDDX编程接口在Web上任意交换结构化数据而不必直接编写XML。从这个意义上讲,可以将这些基于XML的数据交换协议当作一种"XML中间件"使用,即编程语言将其做为一种在数据间交换的传送工具来使用它。当然,对于处理数据本身就是XML格式的应用而言,使用WDDX或SOAP来进行数据传输也同样有效,不过,此时需要开发者了解XML规范与所使用的数据交互协议规范。

无论是XML-RPC、SOAP还是WDDX,就目前而言,其规范均尚有许多局限与不完善处。这其中最主要的原因是,由于它们都是基于XML的数据交换协议,因此不可避免会受到XML规范发展历程的限制。XML-RPC也许是三者中最流行、使用最多的协议,它使用简单、支持平台众多,而且由于诞生较早,已经拥有了大量的用户群,XML-RPC是一种完全开放的技术,你可以随时将你的好建议发给Dave Winer(XML-RPC的缔造者),甚至可以亲身参与到Userland.com的工作中,这对于那些计算机技术的热衷者是绝对具有吸引力的。SOAP也许是今后二十年中最有前途的数据通信协议,它吸取XML与HTTP的一些最新特征,从而改进了许多XML-RPC自身的局限性,而且SOAP试图在最大程度保持其可扩展性,这使我们有理由相信随着XML的发展SOAP也会日趋完美。与XML-RPC相比,SOAP最大的优势也许还在于其背后有强大的开发商支持,当微软与IBM致力于联手推广一项技术时,我们没有理由相信它不会成为一种广泛的工业标准。正如前面所说的,WDDX与XML-RPC、SOAP相比,有着不同的应用范围,它简单准确的功能定位保证了其不会与其它协议如SOAP发生冲突,而是互补,这在很大程度上保证了WDDX的生命力。由于其自身的限制,在大型的商业应用中,WDDX注定无法成为主流,但在某些单一的领域,如对于简单的分布式数据通信而言,它的确是优秀的。





回页首


参考资料

XML高级编程Didier Martion(美)等著机械工业出版社
XML用户手册Charles F. Goldfarb/Paul Prescod人民邮电出版社
XML从入门到精通Ann Navarro(美)电子工业出版社
XML-RPC How To AmosZope.org
XML-RPC Specification UserLand Software, Inc.
XML-RPC for Preferences Dave Winer XMLRPC.COM
消息传递:传递 XML 的困惑 Gordon Van HuizenIBM Developerworks
简单对象访问协议 何杭军中国XML联盟
SOAP:简单对象访问协议 张亚 何杭军中国XML联盟
Web Services and the Simple Object Access Protocol Pete Loshin MSDN
SOAP FAQ Vivek ChopraSOAPRPC.COM
Simple Object Access Protocol (SOAP) 1_1 Don Box、David Ehnebuske等
WDDX Document Type Definition (DTD) Simeon SimeonovAllaire Corporation
WDDX: Distributed Data for the Web Simeon SimeonovAllaire Corporation
Web Distributed Data Exchange (WDDX) FAQ Allaire Corporation
XML与PHP:使用WDDX函数Jes's M. Castagnetto




回页首


名词解释

DCE:分布式计算机环境 (Distributed Computing Environment)
WDDX:基于Web的 分布式数据交换(Web Distributed Data Exchange)
SOAP:简单对象访问协议(Simple Object Access Protocol)
CFML:ColdFusion标记语言(ColdFusion Markup Language )
RPC:远程过程调用(Remote Procedure Call)
MQ:消息队列(Message Queue)
DCOM:分布式组件对象模型(Distributed Component Object Model)
CORBA:公共对象请求处理结构(Common Object Request Broker Architecture)
ADO:活动数据对象(ActiveX Data Objects)
URI:统一资源源识别器(Universal Resource Identifier)
MIME:互联网邮件多用途扩展协议(Multipurpose Internet Mail Extensions)
IETF:互联网工程任务组(Internet Engineering Task Force)


关于作者

郭路

郭路,杭州大学计算机系92届本科应用专业,曾先后就职于浙江省纺织经贸总公司计算机中心、思能软件、华企、飞时达等软件公司,担任技术主管,主要从事于企业 MIS、GIS、ERP 及电子商务项目的开发管理和系统分析,对 IBM、微软、SUN、Autodesk 等公司的企业级产品有较深的研究及理解。
mailto:gl2_public@sina.com




对本文的评价

太差! (1)
需提高 (2)
一般;尚可 (3)
好文章 (4)
真棒!(5)

建议?







回页首


IBM 公司保留在 developerWorks 网站上发表的内容的著作权。未经IBM公司或原始作者的书面明确许可,请勿转载。如果您希望转载,请通过 提交转载请求表单 联系我们的编辑团队。
    关于 IBM 隐私条约 联系 IBM 使用条款