<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Terry.Li-彬

    虛其心,可解天下之問;專其心,可治天下之學;靜其心,可悟天下之理;恒其心,可成天下之業(yè)。

      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      143 隨筆 :: 344 文章 :: 130 評論 :: 0 Trackbacks
    前言
      
      Axis是Apache組織推出的SOAP引擎,Axis項目是Apache組織著名的SOAP項目的后繼項目。Axis為開發(fā)者提供了大量的序列化/反序列化器,能夠基本滿足大部分應用。但在某些情況下,對特定的對象,現(xiàn)有的序列化/反序列化器不能勝任,于是只有開發(fā)人員自己實現(xiàn)專用于此對象的序列化/反序列化器插入到Axis中來完成序列化工作。考慮到Web Service是一門新興技術,中文資料大多是泛泛的講解,關于序列化/反序列化器的開發(fā)鮮有較為深入的介紹,本文提供一份較為完整的開發(fā)指南,并提供了一個十分有用的實現(xiàn),即序列化JDOM模型的Element,使其可以通過Web 服務在網(wǎng)絡上傳輸,我想這一擴展是許多采用JDOM作為XML解析工具的開發(fā)人員都夢寐以求的功能。通過本文的介紹和實例,希望能起到拋磚引玉的作用,讀者在閱讀完本文之后可以輕松的實現(xiàn)針對于任何非符合BEAN規(guī)范的對象的序列化/反序列化器。
      
      本文所面對的讀者需要有一定的使用Axis做Web服務開發(fā)的開發(fā)經(jīng)驗,因此關于如何Axis的基礎知識并不在本文的介紹范圍,如果讀者對此感興趣,可以參考本文最后的參考資料部分,去相應的網(wǎng)站進行學習。
      
      序列化/反序列化器簡介
      
      序列化/反序列化器在英文中的對應翻譯是Serializer/Deserializer,一個序列化器的功能是遵循一定的映射規(guī)則和編碼風格,將一種類型的JAVA對象通過某種特定的機制,轉換成為XML描述的形式;反序列化器的功能是序列化器所做工作的逆操作,兩者相輔相成,成對出現(xiàn)。Axis中的序列化/反序列化器采用設計范式中的工廠模式,每一個Serializer唯一對應一個SerializerFactory;每一個Deserializer唯一對應一個DeserializerFactory。一種類型的JAVA對象具體要采用哪個序列化/反序列化器需要在提供Web服務的服務器和調用Web服務的客戶端分別配置,關于這一部分如何配置,我將在本文后面的內(nèi)容中進行詳細介紹。Axis已經(jīng)為開發(fā)者提供了豐富的序列化/反序列化器,對于java的基本數(shù)據(jù)類型,絕大部分常用的容器類(比如數(shù)組類型,Vector類型等)都提供了實現(xiàn),特別是提供了對W3C的DOM對象(比如Document, Element等)和符合Bean規(guī)范的JAVA對象提供了功能完善的序列化/反序列化器,因此我們在需要的時候只要在配置文件中配置一下就可以直接使用。如果對象中包含其它類型的對象,比如Vector中包含一組Bean對象,Axis會自動疊代的調用序列化器,最終拼裝成唯一的XML表述。在還原成JAVA對象時,也遵循這樣的疊代操作逆向進行。關于Axis到底內(nèi)置了哪些序列化/反序列化器,您可以參照Axis的API文檔中包org.apache.axis.encoding.ser下的類的名稱"望文生義"的了解一下,在以后的開發(fā)中做到心中有數(shù)。但對于一些特殊類型的對象(其實我們自己開發(fā)的很大一部分類都是這種特殊類型的對象,很少有絕對符合Bean規(guī)范的),需要通過Web服務進行傳遞,我們不得不開發(fā)自己的序列化/反序列化器。
      
      開發(fā)篇
      
      開發(fā)自己的序列化/反序列化器是一個激動人心的工作,但是卻并不復雜,需要做的事情包括實現(xiàn)名成為org.apache.axis.encoding的包中的SerializerFactory,Serializer,DeserializerFactory和Deserializer這四個接口。下面我將結合一個實例來講解序列化/反序列化器的開發(fā)方法,希望讀者能夠一邊參看本文提供的源代碼一邊學習。
      
      JDOM作為一款比較"另類"的XML解析工具(因為它不符合W3C的DOM模型,自己另立一套)默默地占領著java世界里的xml解析器的半壁江山,由于其簡潔的設計和方便靈活的API調用,已經(jīng)漸漸成為了許多開發(fā)人員在進行XML開發(fā)的首選。但是Axis是建立在W3C的DOM模型的基礎之上,師出名們正派,自然不屑與JDOM為伍。因此當開發(fā)人員想將自己已經(jīng)寫好的基于JDOM的應用模塊采用Web服務的方式發(fā)布的時候,不可避免的會遇到如何將JDOM模型下的對象如Document, Element等序列化的問題。在軟件工程師不會自己擴展Axis的序列化/反序列化器的時候,我們只能有兩個辦法達到這個目的,第一個就是更改以前應用模塊內(nèi)的API設計,使暴露的入口參數(shù)和返回值參數(shù)都是W3C的對象類型,但這種做法并不現(xiàn)實,因為這一應用模塊往往不是獨立存在,牽一發(fā)將動全身,導致舊有系統(tǒng)架構的崩塌;另一種做法就是為這個模塊做一個代理類,它做的工作就對外接收或返回DOM模型的對象,對內(nèi)轉換成JDOM模型的對象,然后轉發(fā)給應用模塊,繁瑣且效率低下。當我們向Axis注入了針對于JDOM模型的序列化/反序列化器后,這一工作便可以由Axis代勞了。下面我們將逐個開發(fā)這四個類:
      
      JDomElementSerializerFactory
      
      JDomElementSerializerFactory是一個工廠類,需要通過某種機制注冊到Axis引擎(具體方法見下面"服務器端應用篇");Axis通過調用它,來實例化JDomElementSerializer。Axis 提供了BaseSerializerFactory,這個類是一個抽象類,并實現(xiàn)其中包含了一些可重用的代碼。我們自己開發(fā)的工廠類只需簡單繼承這個類就可以。構造函數(shù)中需要調用父類的構造函數(shù)將序列器類下面是它的源代碼:
      
      package org.apache.axis.encoding.ser;
      
      public class JDomElementSerializerFactory
      extends BaseSerializerFactory {
      
      public JDomElementSerializerFactory()
      }
      
      JDomElementSerializer
      
      JDomElementSerializer實現(xiàn)org.apache.axis.encoding.Serializer接口,其核心API是serialize(),我們需要在這個方法的內(nèi)部完成對JDOM模型的Element的序列化工作,序列化的結果要保存在入口參數(shù)傳入的序列化上下文對象(SerializationContext)中:
      
      public void serialize(QName name, Attributes attributes, Object value,
      SerializationContext context) throws java.io.IOException {
      
      if (!(value instanceof Element))
      throw new IOException(
      Messages.getMessage("cant Serialize Object"));
      
      //獲取符合JDOM的Element對象
      Element root=(Element)value;
      
      //輸出到StringWriter
      XMLOutputter outputter=new XMLOutputter();//創(chuàng)建一個JDOM的XML輸出器
      StringWriter sw=new StringWriter();
      outputter.output(root,sw);
      
      //用支持W3C的DOM模型的Xerces解析器解析文本流
      DOMParser parser=new DOMParser();//創(chuàng)建一個DOM的XML解析器
      try {
      parser.parse(new org.xml.sax.InputSource(
      new java.io.StringReader(sw.toString())));
      }catch (Exception ex) {
      throw new java.io.IOException("序列化時產(chǎn)生錯誤");
      }
      
      //獲取符合DOM模型的Element對象
      org.w3c.dom.Element w3c_root =
      parser.getDocument().getDocumentElement();
      
      //放入序列化上下文對象中
      context.startElement(name, attributes);
      context.writeDOMElement(w3c_root);
      context.endElement();
      }
      
      JDomElementDeserializerFactory
      
      反序列化器的工廠類同序列化器的工廠類一樣的設計,在此不在贅述。代碼:
      
      package org.apache.axis.encoding.ser;
      
      public class JDomElementDeserializerFactory
      extends BaseDeserializerFactory {
      
      public JDomElementDeserializerFactory()
      
      }
      
      JDomElementDeserializer
      
      用過SAX解析XML的讀者,對反序列化的實現(xiàn)比較容易理解,反序列化也采用了消息觸發(fā)的機制,我們只需繼承org.apache.axis.encoding.DeserializerImpl類,并覆蓋其中的onEndElement方法:
      
      /**
      * 在元素結束觸發(fā)反序列化的方法
      * @param namespace String 命名空間
      * @param localName String 本地名稱
      * @param context DeserializationContext 反序列化上下文
      * @throws SAXException
      */
      public void onEndElement(String namespace, String localName,
      DeserializationContext context) throws SAXException {
      
      try {
      //從反序列化上下文對象中獲取原始的消息元素
      MessageElement msgElem = context.getCurElement();
      if (msgElem != null) {
      MessageContext messageContext = context.getMessageContext();
      Boolean currentElement = (Boolean) messageContext.getProperty(
      DESERIALIZE_CURRENT_ELEMENT);
      
      //如果當前的消息元素本身需要反序列化
      if (currentElement != null && currentElement.booleanValue()) {
      org.w3c.dom.Element element = msgElem.getAsDOM();
      org.jdom.input.DOMBuilder db=new org.jdom.input.DOMBuilder();
      value=db.build(element);
      messageContext.setProperty(DESERIALIZE_CURRENT_ELEMENT,
      Boolean.FALSE);
      return;
      }
      
      //反序列化消息元素中的消息體
      java.util.ArrayList children = msgElem.getChildren();
      if (children != null) {
      
      //取得消息體
      msgElem = (MessageElement) children.get(0);
      if (msgElem != null) {
      org.w3c.dom.Element ret = msgElem.getAsDOM();
      org.jdom.input.DOMBuilder db=new org.jdom.input.DOMBuilder();
    posted on 2007-11-24 14:42 禮物 閱讀(375) 評論(0)  編輯  收藏 所屬分類: webservice
    主站蜘蛛池模板: 中文文字幕文字幕亚洲色| 久久免费视频精品| 亚洲AV无码成人精品区狼人影院 | a毛片久久免费观看| 日韩久久无码免费毛片软件 | 亚洲AV无码专区国产乱码电影| 亚洲中文字幕无码专区| 亚洲人成国产精品无码| 国产亚洲av人片在线观看| 亚洲自偷自偷在线制服| 黑人精品videos亚洲人| 亚洲av伊人久久综合密臀性色| 亚洲成a人片在线观看无码| 亚洲视频在线免费观看| 亚洲嫩草影院在线观看| 在线综合亚洲中文精品| 国产偷国产偷亚洲清高APP| 一级做a爰片久久毛片免费陪 | 无码国产精品一区二区免费| 男人的好免费观看在线视频| 国产色爽女小说免费看| 亚洲国产综合精品中文字幕| 国产亚洲情侣一区二区无码AV| 亚洲成A人片777777| 亚洲欧洲精品在线| 亚洲区日韩精品中文字幕| 美女视频黄.免费网址| 91视频免费观看高清观看完整| 午夜影院免费观看| 国产三级在线观看免费| 免费A级毛片无码A| 国产亚洲AV无码AV男人的天堂| 亚洲美免无码中文字幕在线| 99久久国产亚洲综合精品| 免费看一级一级人妻片| 午夜免费福利视频| 四虎免费在线观看| 亚洲天堂在线视频| 亚洲激情校园春色| 黄色免费网站在线看| 一级毛片免费观看不卡视频|