65.9K
CodeProject 正在变化。 阅读更多。
Home

ISoapTypeMapper 接口 – C++ 实现

starIconstarIconstarIconemptyStarIconemptyStarIcon

3.00/5 (4投票s)

2001年8月5日

4分钟阅读

viewsIcon

107371

downloadIcon

885

本文档提供了一个 C++ 版的 ISoapTypeMapper 接口的实现,用于将自定义对象序列化为 XML,并通过 SOAP 在网络上传输。

引言

最近,我一直在大量阅读 SOAP 相关资料,并试图熟悉 MS SOAP Toolkit (SP2 版本)。工具包附带的示例非常不错,其中包含不少 C++ 示例。与任何分布式应用程序一样,有趣之处在于将复杂类型作为参数通过网络传输,而不是原始数据类型。本文档提供了一个 C++ 版 (使用 ATL) 的 ISoapTypeMapper 接口实现,用于将自定义对象序列化为 XML,并通过 SOAP 在网络上传输。本文档假设读者熟悉 SOAP、ATL,熟悉设置 IIS 来运行 SOAP 应用,并已安装 MSSOAP toolkit SP2。

项目

正如您将看到的,这个项目仅仅是为了演示 C++ 中 ISoapTypeMapper 接口对复杂对象的实现。本文的目的是展示如何将两个 COM 对象(即 Address 和 Dealer)序列化为 XML,并通过 SOAP 在网络上传输。以下是这两个对象的描述:

  • Address 对象有 5 个属性:“Name”、“Street”、“City”、“State”和“Zip”,全部定义为字符串。

  • Dealer 对象有 2 个属性:“Id”作为字符串,以及“Address”作为上面定义的“Address”对象。

VC++ 项目展示了这些对象的实现,以及另外两个对象的实现,即 AddressMapperDealerMapper,它们实际实现了 ISoapTypeMapper 接口,并帮助将“Address”和“Dealer”对象分别序列化为 XML。

有两个 VB 项目,一个名为 CPlusPlusAddress.vbp,另一个名为 Client.vbpCPlusPlusAddress.vbp 是一个 ActiveX DLL 项目,是 Web Service 的实现。它基本上包含 4 个方法,其功能定义如下:

  1. ProcessAddress - 接受一个 Address 对象作为参数,并返回一个字符串,该字符串实际上是构成 Address 对象的所有字符串的连接。
  2. EchoAddress -- 接受一个 Address 对象作为参数,并返回相同的 Address 对象。
  3. ProcessDealer -- 接受一个 Dealer 对象作为参数,并返回一个字符串,该字符串实际上是构成 Dealer 对象的所有字符串的连接。       
  4. EchoDealer -- 接受一个 Dealer 对象作为参数,并返回相同的 Dealer 对象。

另一个 VB 项目 Client.vbp 是一个标准 EXE,它调用 CPlusPlusAddress Web Service 公开的方法。

入门

首先编译 C++ 项目,该项目实际注册了 Web Service 和客户端使用的类型映射器以及 Address 和 Dealer COM 对象。然后编译 CPlusPlusAddress.vbp 项目,理想情况下您需要生成 .wsdl 和 .wsml 文件。但该项目已包含 WSDL 文件夹中的文件。确保在 IIS 中创建一个虚拟目录,并命名为 CPPAddress。此虚拟目录必须实际指向包含 wsdl 和 wsml 文件的 WSDL 文件夹。然后编译 Client.vbp 项目,您应该就能运行该应用程序了。

AddressMapper 对象

AddressMapper 对象的代码非常直观。ISoapTypeMapper 接口的相关单个方法的用法将在下面解释:

Init() - 由于 Address 对象中的所有属性都是字符串,因此我们只需检索 Soap 工具包附带的字符串映射器并将其存储在 m_pStringMapper 元素中。

read() - read 方法只是读取传入节点对象中的值,并使用这些值构建一个 Address 对象并返回它。

write() - write 方法读取 Address 对象的各个属性的值,并写入要通过网络发送的 XML。

DealerMapper 对象

DealerMapper 对象的工作方式与 AddressMapper 对象类似。DealerMapper 对象使用 AddressMapper 对象来序列化/反序列化 Dealer 对象中的 Address 部分。

结论

本文档本身除了描述构成代码的项目之外,没有做太多。代码非常直观。我决定这样做是因为我在 Develop Mentor 维护的 SOAP 邮件列表中看到了许多关于使用 C++ 序列化复杂数据类型的问题,但没有得到解答。我花了 2-3 天才在网上找到一个实现。我希望这个示例能帮助到其他像我一样因为无法找到关于如何使用 VC++/ATL 来实现此功能而感到沮丧的人。

© . All rights reserved.