• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            posts - 13,comments - 0,trackbacks - 0
            axis 傳輸 簡(jiǎn)單對(duì)象,復(fù)雜對(duì)象,List,Map等收藏
            來(lái)源:http://yangzb.javaeye.com/blog/319900

            那些java的對(duì)象是可以序列化為xml的, 并且可以從xml反序列化為java對(duì)象的?
            那些對(duì)象與xml之間不能夠序列化和反序列化?
            在開(kāi)發(fā)的時(shí)候應(yīng)該注意哪些問(wèn)題?

            根據(jù)我的理解, 有如下幾種對(duì)象:
            1)axis1.2內(nèi)在支持的幾種對(duì)象類型。
            ????????? 這幾種內(nèi)在支持的對(duì)象包括:
            ????????? java基本類型 : int, float,,,,
            ????????? 基本類型包裝類 : Integer, Float, Long...
            ????????? 還有String, Date, Calendar, BigDecimal, BigInteger, List, Map.
            ???? 凡是這些內(nèi)在支持的對(duì)象, 不管他們作為某個(gè)Service的input 還是 output, 我們?cè)诜?wù)端的axis1.2的WEB-INF/server-config.wsdd的該Service的定義中都不需要加入 <beanMapping>或者是<typeMapping>的聲明。

            2)簡(jiǎn)單的javabean對(duì)象類型。
            ?????? 對(duì)于簡(jiǎn)單的javabean對(duì)象, 比如對(duì)象中所有的field都是上面提到的基本類型。 axis1.2也提供了很好的支持。
            ?????? 比如:
            ?????? public class JavaBeanInputService {
            ?????????? public void testJavaBeanInput(MyBean bean) {
            ?????????????? ......
            ????????? }
            ?????? }
            ???????? 由于MyBean是一個(gè)自定義的JavaBean對(duì)象, 所以在server-config.wsdd中就必須加上<beanMapping ...../>的聲明, 讓axis知道怎么把request中xml數(shù)據(jù)deserialize為MyBean對(duì)象, 又如何把MyBean對(duì)象serialize為xml數(shù)據(jù)作為response.用wtp自動(dòng)為JavaInputService生成的wsdl中, MyBean是作為一個(gè)complexType在wsdl中定義的。

            3)復(fù)雜一點(diǎn)的JavaBean對(duì)象。
            ??????? 比如JavaBean對(duì)象中的一些field又是自定義的JavaBean,? 這種情況下, wsdl中生成的complextype會(huì)有多個(gè), 而在wsdd定義的<beanMapping .../>也會(huì)有多個(gè), axis1.2支持起來(lái)都是易如反掌。

            4)普通的非javabean對(duì)象。
            ????? 對(duì)于一些不是javaBean的對(duì)象, wtp也會(huì)替你生成對(duì)應(yīng)的wsdl的ComplexType, 依據(jù)的是對(duì)象的getter方法。但是顯然這是不夠的。 比如說(shuō)有些對(duì)象的數(shù)據(jù)結(jié)構(gòu)比較復(fù)雜, 像java.util.HashMap(雖然這個(gè)已經(jīng)被axis內(nèi)在支持了。)這些對(duì)象如果想要把自己的狀態(tài)進(jìn)行serialization和 deserialization, 就得自己編寫(xiě)serializer和deserializer,? 而且還必須保證wsdl中的該complexType的描述是正確的。

            5)java中的List, Map問(wèn)題。
            ?????? 試想一下如果一個(gè)service的樣子是這樣子的。

            ?????? public class ListService{
            ???????????? public List listTest(List list) {
            ??????????????????? for(Iterator iter = list.iterator(); iter.hasNext(); ) {
            ?????????????????????????? (MyBean)list.next();//進(jìn)行強(qiáng)轉(zhuǎn)。
            ??????????????????? }
            ????????????? }
            ?????? }
            ??????? 用wtp為這個(gè)service生成的wsdl中把list映射為一個(gè)type為xsd:anyType的maxOccurs="unbound"的complexType。這樣的話客戶端生成的Stub中的接口中類似于:
            ??????? public interface ListService{
            ???????????? public Object[] listTest(Object[] list) ;
            ??????? }
            ??????? 如果Client端用戶傳遞的入口參數(shù)是String[],那么在服務(wù)端執(zhí)行的必然會(huì)發(fā)生轉(zhuǎn)型錯(cuò)誤。
            ??????? 因此,在webservice中把List, Map作為service的input, output的做法都是不可行的。至少在jdk1.4的版本中是這樣的。
            ??????? 一個(gè)更好的方法就是:

            6)java中的數(shù)組。
            ????? 上例中的ListService如果改造為下面這樣,基本上就沒(méi)有上面提到的問(wèn)題了。
            ????? public class ListService{
            ???????????? public MyBean[] listTest(MyBean[] list) {
            ?????????????????? ...
            ???????????? }
            ?????? }
            ??????? 這樣在wsdl中, MyBean被映射為一種ComplexType,MyBean[]為映射為ComplexType為映射為可以重復(fù)出現(xiàn)的MyBean類型。在客戶端的 Stub的接口跟這個(gè)也是類似的。從而也成功地避免了List, Map中型別問(wèn)題。

            ?????? 要注意的是,在server-config.wsdd中需要配置<arrayMapping.../>
            ?????? 似乎List, Map的問(wèn)題用數(shù)組就可以解決了。事實(shí)上就是如此。但是還得注意的是:
               javabean里邊也不能含有List. 如果MyBean跟其它某個(gè)對(duì)象是1:n的關(guān)系,那么也只能寫(xiě)成數(shù)組的形式,而不能是List的形式。

            7)特殊對(duì)象java.lang.Object
            ?????? 如果一個(gè)service寫(xiě)成了下面的形式:
            ?????? public class ObjectService{
            ???????????? public Object objInvoke(Object obj) {
            ?????????????????? ...
            ???????????? }
            ?????? }
            ??????? 想把它發(fā)布為web service, 那么幾乎是不太可能的。遇到obj類型,wsdl里邊只能定義為xsd:anyType類型,而這種類型如果給客戶端返回一個(gè)比如MyBean類型,那么 必然會(huì)導(dǎo)致xml的serialization的失敗。結(jié)論就是:

            ???????? web service中如果input 或者是output是java.lang.Object類型,那么將會(huì)導(dǎo)致嚴(yán)重問(wèn)題。
            ???????
            ??????? 上 面的幾種對(duì)象類型基本上能夠涵蓋將java class發(fā)布為web service時(shí)需要考慮的對(duì)象類型??梢钥吹介_(kāi)發(fā)web service的時(shí)候,并不是所有的java都能夠輕而易舉地發(fā)布為web service, 一些復(fù)雜的類的對(duì)象類型,還有一些特殊的對(duì)象類型都是要考慮的。最后一個(gè)問(wèn)題是:子類是否也很容易的得到序列化和反序列化?
            ???????? 答案是肯定的。如下的Service:
            ????????? public class PolymorphicService{
            ???????????? public MyBean objInvoke(MyBean obj) {
            ?????????????????? ...
            ???????????? }
            ???????? }
            ????????? 客戶端的Stub如下:
            ????????? public class PolymorphicServiceStub{
            ???????????? public MyBean objInvoke(MyBean obj) {
            ?????????????????? ...
            ???????????? }
            ???????? }
            ???????? 如果在客戶端調(diào)用stub時(shí)傳入的不是MyBean類的對(duì)象,而是它的子類的一個(gè)對(duì)象,那么也可以被序列化而傳到服務(wù)端。同樣,如果服務(wù)端返回的對(duì)象是MyBean類的字類的一個(gè)對(duì)象,也可以成功的被序列化到客戶端。
            posted on 2009-05-25 11:13 收藏也是種愛(ài)好 閱讀(1058) 評(píng)論(0)  編輯 收藏 引用 所屬分類: Java

            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


            久久综合久久自在自线精品自| 久久精品一本到99热免费| 久久精品国产亚洲av瑜伽| 欧美久久一级内射wwwwww.| 97视频久久久| 99久久国产热无码精品免费 | 久久97久久97精品免视看| 久久青青国产| 97久久精品国产精品青草| 国产三级观看久久| 久久精品毛片免费观看| 久久久久久久久久免免费精品 | 久久免费观看视频| 国产精品久久久久久久久鸭| 婷婷久久综合| 国产福利电影一区二区三区久久老子无码午夜伦不 | 无码人妻少妇久久中文字幕| 久久国产色AV免费观看| 亚洲午夜福利精品久久| 久久最新精品国产| 欧美丰满熟妇BBB久久久| 欧美精品一区二区久久| 久久线看观看精品香蕉国产| 中文字幕久久波多野结衣av| 久久九九久精品国产| 亚洲精品高清国产一久久| 久久w5ww成w人免费| 午夜精品久久久久久久久| 一级女性全黄久久生活片免费| 青青草国产精品久久| 国产一级持黄大片99久久| 欧美一区二区三区久久综| 中文字幕热久久久久久久| 亚洲国产精品无码久久久不卡| 久久无码高潮喷水| 久久人人爽人人爽人人av东京热| 久久久WWW成人免费毛片| 久久嫩草影院免费看夜色| 日本WV一本一道久久香蕉| 伊人精品久久久久7777| 国内精品久久久久久久久电影网|