</t:transfer>
這個(gè)表達(dá)有兩個(gè)問題。首先最容易理解的問題是同樣的信息被發(fā)送了兩次,這導(dǎo)致了一個(gè)比實(shí)際所需要消息的更大的消息。一個(gè)更微妙的但是更重要的問題是由于反序列化程序不能分辨兩個(gè)帶有同樣值的adjustment對(duì)象與在兩個(gè)地方被引用的一個(gè)單一的adjustment對(duì)象的區(qū)別,兩個(gè)存取元素間的身份關(guān)系就被丟失。如果這個(gè)消息接收者已經(jīng)在結(jié)果對(duì)象上執(zhí)行了下面的測(cè)試,(xfer.to == xfer.from)將不會(huì)返回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的事實(shí)只是比較了兩個(gè)存取元素的值而不是它們身份。
為了支持必須保持身份關(guān)系的類型的序列化,soap支持多引用存取元素。目前我們接觸到的存取元素是單引用存取元素,也就是說,元素值是嵌入在存取元素下面的,而且其它存取元素被允許引用那個(gè)值(這很類似于在ndr中的[unique]的概念)。多引用存取元素總是被編碼為只包含已知的soap:href屬性的空元素。soap:href屬性總是包含一個(gè)代碼片段標(biāo)識(shí)符,它對(duì)應(yīng)于存取元素引用到的實(shí)例。如果to和from存取元素已經(jīng)被編碼為多引用存取元素,序列化的transfer對(duì)象如下所示:
<t:transfer
xmlns:t=‘urn:develop-com:java:com.bofsoap.ibank‘>
<from soap:href=‘#id1‘ />
<to soap:href=‘#id1‘ />
</t:transfer>
這個(gè)編碼假設(shè)與adjustment類兼容的一個(gè)類型的實(shí)例已經(jīng)在envelope中的其它地方被序列化,而且這個(gè)實(shí)例已經(jīng)被用soap:id屬性標(biāo)記,如下所示:
<t:adjustment soap:id=‘id1‘
xmlns:t=‘urn:develop-com:java:com.bofsoap.ibank‘>
<account>3514</account>
<amount>-100.0</amount>
</t:adjustment>
對(duì)多引用存取元素,把代碼段的標(biāo)識(shí)符(例如#id1)分解到正確的實(shí)例是反序列化程序的工作。
前面的討論解釋了多引用存取元素怎樣與它的目標(biāo)實(shí)例相關(guān)聯(lián)。下面要討論的是目標(biāo)實(shí)例在哪里被序列化。這就關(guān)系到獨(dú)立元素和包的概念。
新聞熱點(diǎn)
疑難解答
圖片精選