<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對象用下面這種方式初始化將會發生什么情況:
transferxfer=newtransfer();
xfer.from=newadjustment();
xfer.from.account=3514;xfer.from.amount=-100;
xfer.to=xfer.from;
基于以前的議論,在SOAP中transfer對象的序列化形式如下所示:
<t:transferxmlns: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。
voidprocessTransfer(transferxfer){
if(xfer.to==xfer.from)
handleDoubleAdjustment(xfer.to);
else
handleAdjustments(xfer.to,xfer.from);
}
為了支持必須保持身份關系的類型的序列化,SOAP支持多引用存取元素。目前我們接觸到的存取元素是單引用存取元素,也就是說,元素值是嵌入在存取元素下面的,而且其它存取元素被允許引用那個值(這很類似于在NDR中的[unique]的概念)。多引用存取元素總是被編碼為只包含已知的soap:href屬性的空元素。soap:href屬性總是包含一個代碼片段標識符,它對應于存取元素引用到的實例。如果to和from存取元素已經被編碼為多引用存取元素,序列化的transfer對象如下所示:
<t:transferxmlns:t=''urn:develop-com:java:com.bofsoap.IBank''>
<fromsoap:href=''#id1''/>
<tosoap:href=''#id1''/>
</t:transfer>
這個編碼假設與adjustment類兼容的一個類型的實例已經在envelope中的其它地方被序列化,而且這個實例已經被用soap:id屬性標記,如下所示:
<t:adjustmentsoap:id=''id1''xmlns:t=''urn:develop-com:java:com.bofsoap.IBank''>
<account>3514</account>
<amount>-100.0</amount>
</t:adjustment>
第四節結語
一個遺留的HTTP問題還需要進一步闡明。SOAP支持(但不需要)HTTP擴展框架約定來指定必須的HTTP頭擴展。這些約定主要有兩個目的。首先,它們允許任意的URI被用于限定給定的HTTP頭的范圍(類似XML名域)。第二,這些約定允許把必須的頭與可選的頭區分開來(象soap:mustUnderstand)。下面是一個使用HTTP擴展框架來把SOAPMethodName頭定義成為一個必須的頭擴展:
M-POST/foobarHTTP/1.1
Host:209.110.197.2
Man:"urn:schemas-xmlsoap-org:soap.v1;ns=42"
42-SOAPMethodName:urn:bobnsid:IFoo#DoIt
Man頭映射SOAPURI到前綴為42的頭,并表示沒有認出SOAP的服務器必須返回一個HTTP錯誤,狀態代碼為501(沒有被實現)或510(沒有被擴展)。HTTP方法必須是M-POST,表明目前是必須的頭擴展。SOAP是一個被類型化的序列化格式,它恰巧用HTTP作為請求/響應消息傳輸協議。SOAP被設計為與正將出現的XMLSchema規范密切配合,并支持在Internet的任何地方運行的COM、CORBA、Perl、Tcl、和Java、C、Python或PHP等程序間的互操作性。