与存取元素相关的另一个问题是由于类型关系引起的可代换性。由于前面的adjustment类不是一个final类型的类,transfer对象的from和to域实际引用继承类型的实例是可能的。为了支持这种类型兼容的替换,SOAP使用一个名域限定的类型属性的XML Schema约定。这种类型属性的值是一个对元素具体的类型的限制的名字。考虑下面的adjustment扩展类:

package com.bofsoap.IBank;

public class auditedadjustment extends adjustment {

public int auditlevel;

}

  给出下面Java语言:

transfer xfer = new transfer();

xfer.from = new auditedadjustment();

xfer.from.account = 3514; xfer.from.amount = -100;

xfer.from.auditlevel = 3;

xfer.to = new adjustment();

xfer.to.account = 3518; xfer.from.amount = 100;

  在SOAP中transfer对象的序列化形式如下所示:

<t:transfer

xmlns:xsd=‘http://www.w3.org/1999/XMLSchema‘

xmlns:t=‘urn:develop-com:java:com.bofsoap.IBank‘

<from xsd:type=‘t:auditedadjustment‘ >

<account>3514</account>

<amount>-100.0</amount>

<auditlevel>3</auditlevel >

</from>

<to>

<account>3518</account>

<amount>100.0</amount>

</to>

</t:transfer>

  在这里xsd:type属性引用一个名域限定的类型名,它能被反序列化程序用于实例化对象的正确类型。因为to存取元素引用到一个被预料的类型的实例(而不是一个可代替的继承类型),xsd:type属性是不需要的。

  刚才的transfer类设法回避了一个关键问题。如果正被序列化的transfer对象用下面这种方式初始化将会发生什么情况:

transfer xfer = new transfer();

xfer.from = new adjustment();

xfer.from.account = 3514; xfer.from.amount = -100;

xfer.to = xfer.from;

  基于以前的议论,在SOAP 中transfer对象的序列化形式如下所示:

<t:transfer

xmlns:t=‘urn:develop-com:java:com.bofsoap.IBank‘>

<from>

<account>3514</account>

<amount>-100.0</amount>

</from>

<to>

<account>3514</account>

<amount>-100.0</amount>

</to>

</t:transfer>

  这个表达有两个问题。首先最容易理解的问题是同样的信息被发送了两次,这导致了一个比实际所需要消息的更大的消息。一个更微妙的但是更重要的问题是由于反序列化程序不能分辨两个带有同样值的adjustment对象与在两个地方被引用的一个单一的adjustment对象的区别,两个存取元素间的身份关系就被丢失。如果这个消息接收者已经在结果对象上执行了下面的测试,(xfer.to == xfer.from)将不会返回true。

void processTransfer(transfer xfer) {

if (xfer.to == xfer.from)

handleDoubleAdjustment(xfer.to);

else

handleAdjustments(xfer.to, xfer.from);

}

  (xfer.to.equals(xfer.from))可能返回true的事实只是比较了两个存取元素的值而不是它们身份。

为了支持必须保持身份关系的类型的序列化,SOAP支持多引用存取元素。目前我们接触到的存取元素是单引用存取元素,也就是说,元素值是嵌入在存取元素下面的,而且其它存取元素被允许引用那个值(这很类似于在NDR中的[unique]的概念)。多引用存取元素总是被编码为只包含已知的soap:href属性的空元素。soap:href属性总是包含一个代码片段标识符,它对应于存取元素引用到的实例。如果to和from存取元素已经被编码为多引用存取元素,序列化的transfer对象如下所示:

<t:transfer

xmlns:t=‘urn:develop-com:java:com.bofsoap.IBank‘>

<from soap:href=‘#id1‘ />

<to soap:href=‘#id1‘ />

</t:transfer>

  这个编码假设与adjustment类兼容的一个类型的实例已经在envelope中的其它地方被序列化,而且这个实例已经被用soap:id属性标记,如下所示:

<t:adjustment soap:id=‘id1‘

xmlns:t=‘urn:develop-com:java:com.bofsoap.IBank‘>

<account>3514</account>

<amount>-100.0</amount>

</t:adjustment>

  对多引用存取元素,把代码段的标识符(例如#id1)分解到正确的实例是反序列化程序的工作。

  前面的讨论解释了多引用存取元素怎样与它的目标实例相关联。下面要讨论的是目标实例在哪里被序列化。这就关系到独立元素和包的概念。

转载于:https://www.cnblogs.com/alaricblog/p/3278254.html

SOAP协议初级指南(7)相关推荐

  1. SOAP协议初级指南(9)

    错误处理 一个服务器有时将不能正确地为一个方法请求提供服务.这可能是由于一般的HTTP错误造成的(如请求-URI不能被映射到本地的资源或一个HTTP级的安全违反).也可能是在SOAP翻译软件中的问题, ...

  2. SOAP协议初级指南(2)

    目前的技术存在的问题? 尽管DCOM和IIOP都是固定的协议,业界还没有完全转向其中任何一个协议.没有融合的部分原因是文化的问题所致.而且在当一些组织试图标准化一个或另一个协议的时候,两个协议的技术适 ...

  3. 简单对象访问协议(SOAP)初级指南

    这篇文章带你全面回顾对象远程进程调用(ORPC)技术的历程,以帮助你理解SOAP技术的基础,以及它克服存在技术(如CORBA和DCOM)的许多缺陷的方法.随后讲述详细的SOAP编码规则,并把焦点放在S ...

  4. 详解基于J2ME平台下SOAP协议的应用

    J2ME作为嵌入式系统应用平台得到了迅速的发展,JAVA语言固有的平台无关性使得基于J2ME平台的嵌入式应用系统具有广阔的前景.受限于嵌入式设备及消费类电器硬件条件的限制,J2ME平台提供的功能有限, ...

  5. 08_使用TCP/IP Monitor监视SOAP协议

    [SOAP定义] SOAP   简单对象访问协议,基于http传输xml数据,soap协议体是xml格式. SOAP   是一种网络通信协议 SOAP   即Simple Object Access ...

  6. soap协议_Go和SOAP

    在REST和RPC大行其道的今天,支持SOAP(简答对象访问协议)作为Web服务消息交换协议的情况是越来越少了.但在一些遗留系统中,尤其是采用微软技术栈的服务系统中,SOAP依然占有一席之地,比如在一 ...

  7. TCP/IP协议精华指南pdf发布

    hi ,大家好,应小伙伴们的要求,昨天分享了个人的一些学习经验: 个人学习方法分享 这些经验是我自己多年不断总结得出的,希望可以给大家一点参考借鉴,但路还是需要自己走,大家还是要自己多总结,后面也可以 ...

  8. Android与服务器端数据交互(基于SOAP协议整合android+webservice)

    转自:http://www.cnblogs.com/zhangdongzi/archive/2011/04/19/2020688.html 上一节中我们通过http协议,采用HttpClient向服务 ...

  9. 6 使用soap客户端_网络协议 20 - RPC 协议(上)- 基于XML的SOAP协议

    上一节我们了解 RPC 的经典模型和设计要点,并用最早期的 ONC RPC 为例子,详述了具体的实现.而时代在进步,ONC RPC 逐渐因为各种问题被替代,SOAP 协议就是替代者之一. ONC RP ...

最新文章

  1. ssh错误 server not ready for puppeth err=“ssh: handshake failed: ssh: unable to authenticate... 解决方法
  2. thymeleaf获取当前时间并格式化输出
  3. WEB前端 从原生JavaScript到MVVM
  4. HiveQL与SQL区别
  5. MobileIron Access保障移动设备的企业云数据安全
  6. 【转载】究竟什么是POJO?
  7. 【git】 vim的使用
  8. EntityFramework(EF) 单表与主从表的使用
  9. 企业从信息化角度解读智慧城市,难以根治城市病
  10. Java后台快速开发框架
  11. 0618----Shell(二)
  12. 计算机专业毕业设计题目汇总-最新题目 选题 推荐 毕业设计 - 毕设指导 开题报告 论文
  13. excel如何把顺序倒过来_在excel中怎么使文字颠倒顺序反过来显示呢?
  14. react 组件封装原则_React 组件封装
  15. 如何批量下载网站中的超链接(一次性下载网页中所有可能的PDF文件)
  16. hdu3594-仙人掌图的判断tarjan找环-Cactus
  17. 2020 Stibo Systems全球事业部新财年启动大会胜利召开
  18. 闲人闲谈PS之五——项目型企业核算方式选择
  19. blender操作说明
  20. 实操-安装esxi6.0和配置

热门文章

  1. 从头学习DirectDraw
  2. 周末也需要学习 分享一个 Flutter 波浪波动效果的登录页面的背景 Flutter ClipPath实现的波动
  3. Flutter Stack 帧布局,层叠堆放
  4. Nike Hyperdunk 2012 Men's Basketball Shoes Black/Gorge Green
  5. 微信小程序图片选择,预览和删除
  6. 【UVALive】3029 City Game(悬线法)
  7. notejs环境搭建
  8. meta 标签的学习
  9. php基础_变量和比较符
  10. 获得创建临时表的session id