Welcome 微信登录

首页 / 软件开发 / JAVA / 提高J2EE与.NET之间的互操作性,第2部分

提高J2EE与.NET之间的互操作性,第2部分2011-03-14 IBM 引言

该系列文章的第 I 部分讨论了在编码之前设计 Web 服务描述语言(Web Services Description Language,WSDL)和 XML Schema 数据类型(XML Schema data types,XSD)的重要性,完全转换成文档或文字式样的基本原理,以及当开发 Web 服务的时候测试 WS-I Basic Profile 一致性的必要性。本文阐明了数据类型的用法及其对互操作性产生的影响。

Web 服务操作的输入参数及数据类型的返回值对于 Web 服务的互操作性产生非常大的影响。Web 服务用作 XML 文档转换的传送器。当数据对象被放入 Web 服务栈中时,它们被序列化成 XML 数据表示。另一方面,Web 服务栈需要准确地知道如何将那些 XML 数据表示映射到本地应用程序环境的需求中(例如 XML 数据的反序列化)。XML Schema 定义驱动了映射。XSD 的目的是确保发送的类型在其他终端有可复写的版本。但是由于基本技术(企业版 Java 2 平台(Java™ 2 Platform,Enterprise Edition,J2EE)与 Mircosoft® .NET)的实现是不同的,所以 XSD 和那些平台上的本地数据类型之间的映射可能会不同。某些差异可能导致反序列化的失败,而其它的可能导致信息失真。

在接下来的部分中,我将讨论一些有关数据类型的互操作性的问题,例如:

提供商用于精确解释 XML Schema 的工具是不存在的,XML Schema 代表弱类型的集合对象并将它们映射成正确的本地数据类型。

含有空元素的数组的 XML 表示不同于 .NET 和 IBM® WebSphere®。

由于缺乏本地和 XSD 数据类型所共享的一对一的映射,所以转译问题导致了信息的丢失或精度的降低。

在 Web 服务方法签名中的复合数据类型集

集合对象可能包括任何数据类型的元素。因此,许多人把它们看作弱类型的数据结构。这使得它们成为非常好的编程工具。在面向对象的编程中,有大量的集合类型库。例如,在 Java 中存在:

java.util.Hashtable

Vectors

Hashmap

Set

ArrayList

而在 C# 中存在:

System.Collections.Hashtable

SortedList

Queue

Stack

ArrayList

如果在整个 Web 服务中公布了这些集合类型,那么它们可能引发不能被解决的问题。该问题是接收方如何能理解被序列化了的简单对象访问协议(Simple Object Access Protocol,SOAP)消息,这些消息中包含弱类型对象元素及本地数据类型。

即使一些集合类型看上去与某些语言非常相似,例如 C# 中的 System.Collections.ArrayList 及 Java 中的 java.util.ArrayList,记住集合中的元素是通用的参照。为了准确地解组集合的 XML 表示,客户必须预先了解原始的具体类型。这个任务交给工具包开发人员来解释 Web 服务提供者所发布的 XML Schemas 并将 SOAP 消息映射到本地数据中——不是对于弱类型集合的简单任务。

现在,让我们来看一看 Collection 类型的 XML Schemas 是什么样子。这次,考虑部署在 Microsoft .NET 框架上的 Web 服务。假设 InventoryService 接受 Product 的 System.Collections.ArrayList 作为变量,为 ArrayList 中的每个产品设置新价格(增长了百分之 10),并且返回 System.Collections.ArrayList 类型的新对象。