亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

Axis序列化/反序列化器開發指南

2019-11-18 12:26:15
字體:
來源:轉載
供稿:網友

  前言
  
  Axis是Apache組織推出的SOAP引擎,Axis項目是Apache組織聞名的SOAP項目的后繼項目。Axis為開發者提供了大量的序列化/反序列化器,能夠基本滿足大部分應用。但在某些情況下,對特定的對象,現有的序列化/反序列化器不能勝任,于是只有開發人員自己實現專用于此對象的序列化/反序列化器插入到Axis中來完成序列化工作。考慮到Web Service是一門新興技術,中文資料大多是泛泛的講解,關于序列化/反序列化器的開發鮮有較為深入的介紹,本文提供一份較為完整的開發指南,并提供了一個十分有用的實現,即序列化JDOM模型的Element,使其可以通過Web 服務在網絡上傳輸,我想這一擴展是許多采用JDOM作為xml解析工具的開發人員都夢寐以求的功能。通過本文的介紹和實例,希望能起到拋磚引玉的作用,讀者在閱讀完本文之后可以輕松的實現針對于任何非符合BEAN規范的對象的序列化/反序列化器。
  
  本文所面對的讀者需要有一定的使用Axis做Web服務開發的開發經驗,因此關于如何Axis的基礎知識并不在本文的介紹范圍,假如讀者對此感愛好,可以參考本文最后的參考資料部分,去相應的網站進行學習。
  
  序列化/反序列化器簡介
  
  序列化/反序列化器在英文中的對應翻譯是Serializer/Deserializer,一個序列化器的功能是遵循一定的映射規則和編碼風格,將一種類型的java對象通過某種特定的機制,轉換成為XML描述的形式;反序列化器的功能是序列化器所做工作的逆操作,兩者相輔相成,成對出現。Axis中的序列化/反序列化器采用設計范式中的工廠模式,每一個Serializer唯一對應一個SerializerFactory;每一個Deserializer唯一對應一個DeserializerFactory。一種類型的JAVA對象具體要采用哪個序列化/反序列化器需要在提供Web服務的服務器和調用Web服務的客戶端分別配置,關于這一部分如何配置,我將在本文后面的內容中進行具體介紹。Axis已經為開發者提供了豐富的序列化/反序列化器,對于java的基本數據類型,絕大部分常用的容器類(比如數組類型,Vector類型等)都提供了實現,非凡是提供了對W3C的DOM對象(比如Document, Element等)和符合Bean規范的JAVA對象提供了功能完善的序列化/反序列化器,因此我們在需要的時候只要在配置文件中配置一下就可以直接使用。假如對象中包含其它類型的對象,比如Vector中包含一組Bean對象,Axis會自動疊代的調用序列化器,最終拼裝成唯一的XML表述。在還原成JAVA對象時,也遵循這樣的疊代操作逆向進行。關于Axis到底內置了哪些序列化/反序列化器,您可以參照Axis的API文檔中包org.apache.axis.encoding.ser下的類的名稱"望文生義"的了解一下,在以后的開發中做到心中有數。但對于一些非凡類型的對象(其實我們自己開發的很大一部分類都是這種非凡類型的對象,很少有絕對符合Bean規范的),需要通過Web服務進行傳遞,我們不得不開發自己的序列化/反序列化器。
  
  開發篇
  
  開發自己的序列化/反序列化器是一個激動人心的工作,但是卻并不復雜,需要做的事情包括實現名成為org.apache.axis.encoding的包中的SerializerFactory,Serializer,DeserializerFactory和Deserializer這四個接口。下面我將結合一個實例來講解序列化/反序列化器的開發方法,希望讀者能夠一邊參看本文提供的源代碼一邊學習。
  
  JDOM作為一款比較"另類"的XML解析工具(因為它不符合W3C的DOM模型,自己另立一套)默默地占領著java世界里的xml解析器的半壁江山,由于其簡潔的設計和方便靈活的API調用,已經漸漸成為了許多開發人員在進行XML開發的首選。但是Axis是建立在W3C的DOM模型的基礎之上,師出名們正派,自然不屑與JDOM為伍。因此當開發人員想將自己已經寫好的基于JDOM的應用模塊采用Web服務的方式發布的時候,不可避免的會碰到如何將JDOM模型下的對象如Document, Element等序列化的問題。在軟件工程師不會自己擴展Axis的序列化/反序列化器的時候,我們只能有兩個辦法達到這個目的,第一個就是更改以前應用模塊內的API設計,使暴露的入口參數和返回值參數都是W3C的對象類型,但這種做法并不現實,因為這一應用模塊往往不是獨立存在,牽一發將動全身,導致舊有系統架構的崩塌;另一種做法就是為這個模塊做一個代理類,它做的工作就對外接收或返回DOM模型的對象,對內轉換成JDOM模型的對象,然后轉發給應用模塊,繁瑣且效率低下。當我們向Axis注入了針對于JDOM模型的序列化/反序列化器后,這一工作便可以由Axis代勞了。下面我們將逐個開發這四個類:
  
  JDomElementSerializerFactory
  
  JDomElementSerializerFactory是一個工廠類,需要通過某種機制注冊到Axis引擎(具體方法見下面"服務器端應用篇");Axis通過調用它,來實例化JDomElementSerializer。Axis 提供了BaseSerializerFactory,這個類是一個抽象類,并實現其中包含了一些可重用的代碼。我們自己開發的工廠類只需簡單繼續這個類就可以。構造函數中需要調用父類的構造函數將序列器類下面是它的源代碼:
  
  package org.apache.axis.encoding.ser;
  
  public class JDomElementSerializerFactory
  extends BaseSerializerFactory {
  
  public JDomElementSerializerFactory() {
  super(JDomElementSerializer.class);
  }
  }
  
  JDomElementSerializer
  
  JDomElementSerializer實現org.apache.axis.encoding.Serializer接口,其核心API是serialize(),我們需要在這個方法的內部完成對JDOM模型的Element的序列化工作,序列化的結果要保存在入口參數傳入的序列化上下文對象(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();//創建一個JDOM的XML輸出器
  StringWriter sw=new StringWriter();
  outputter.output(root,sw);
  
  //用支持W3C的DOM模型的Xerces解析器解析文本流
  DOMParser parser=new DOMParser();//創建一個DOM的XML解析器
  try {
  parser.parse(new org.xml.sax.InputSource(
  new java.io.StringReader(sw.toString())));
  }catch (Exception ex) {
  throw new java.io.IOException("序列化時產生錯誤");
  }
  
  //獲取符合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() {
  super(JDomElementDeserializer.class);
  }
  
  }
  
  JDomElementDeserializer
  
  用過SAX解析XML的讀者,對反序列化的實現比較輕易理解,反序列化也采用了消息觸發的機制,我們只需繼續org.apache.axis.encoding.DeserializerImpl類,并覆蓋其中的onEndElement方法:
  
  /**
  * 在元素結束觸發反序列化的方法
  * @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();
  
  //用DOMBuilder將DOM模型的Element,轉換成JDOM模型的Element
  value=db.

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产日韩欧美中文在线播放| 欧美二区在线播放| 这里只有视频精品| 亚洲日本中文字幕| 久久精品久久久久电影| 久久成人一区二区| 91av视频在线| 国产丝袜一区二区三区免费视频| 国产日韩欧美中文在线播放| 国自产精品手机在线观看视频| 日韩av电影手机在线| 国产精品高潮视频| 国产精品第一页在线| 国产激情综合五月久久| 国产精品av电影| 亚洲偷熟乱区亚洲香蕉av| 美女久久久久久久| 国产日韩精品综合网站| 亚洲美腿欧美激情另类| 97超碰色婷婷| 国产亚洲精品久久久优势| 国产精品免费在线免费| 中文字幕欧美精品在线| 欧美日韩激情视频| 欧美日韩人人澡狠狠躁视频| 久久综合久久88| 久久精品国产69国产精品亚洲| 欧美视频裸体精品| 国产日韩中文字幕在线| 久久久久久美女| 日韩免费观看网站| 欧美激情亚洲视频| 欧美亚洲激情视频| 欧美日韩在线看| 亚洲老板91色精品久久| 国产精品视频1区| 日韩有码在线视频| 国产精品午夜国产小视频| 黑人巨大精品欧美一区二区三区| 国产国产精品人在线视| 久久久精品国产亚洲| 国产免费一区二区三区在线观看| 久久久精品美女| 欧洲亚洲女同hd| 欧美精品一区二区三区国产精品| 国产成人在线一区| 亚洲自拍欧美另类| 91国产在线精品| 精品国模在线视频| 国产亚洲a∨片在线观看| 日韩电影免费在线观看中文字幕| 欧美精品福利在线| 亚洲福利影片在线| 国产在线不卡精品| 久久久久国产精品免费| 欧美日韩成人免费| 国产精品黄页免费高清在线观看| 国产亚洲欧美日韩一区二区| 久久久久久国产免费| 亚洲最大在线视频| 久久精视频免费在线久久完整在线看| 欧美日韩精品国产| 91精品美女在线| 国产午夜精品一区理论片飘花| 成人午夜激情网| 日韩av大片在线| 国产日韩欧美综合| 日韩av在线免费观看一区| 国内精品久久久| 国产精品九九久久久久久久| 欧美激情欧美狂野欧美精品| www.亚洲天堂| 欧美性猛交xxxx黑人猛交| 亚洲视频免费一区| 亚洲精品久久久久久久久| 日韩精品欧美激情| 国产精品视频地址| 亚洲精品一区中文字幕乱码| 亚洲影院高清在线| 一区二区三区 在线观看视| 97福利一区二区| 国产亚洲人成a一在线v站| 91美女福利视频高清| 欧美日韩日本国产| 97在线视频免费看| 国产精品精品久久久久久| 亚洲天堂第二页| 欧美亚洲第一区| 亚洲自拍av在线| 欧美老少做受xxxx高潮| 欧美日韩国产激情| 久久久999成人| 国产精品视频999| 国产精品亚洲аv天堂网| 成人福利视频在线观看| 色偷偷综合社区| 日韩av中文字幕在线免费观看| 神马久久久久久| 国产一区玩具在线观看| 欧美日韩国产在线| 青草青草久热精品视频在线网站| 在线视频精品一| 亚洲精品一区在线观看香蕉| 777国产偷窥盗摄精品视频| 欧美成人午夜影院| 亚洲欧美变态国产另类| 欧美一级电影久久| 九九精品在线播放| 亚洲偷熟乱区亚洲香蕉av| 亚洲free性xxxx护士hd| 日韩专区在线观看| 欧美大尺度激情区在线播放| 久热精品视频在线免费观看| 亚洲成人av资源网| 国产欧美欧洲在线观看| 国产精品白嫩美女在线观看| 欧美色另类天堂2015| 亚洲一区第一页| 国产精品91免费在线| 亚洲第一页自拍| 日韩高清av一区二区三区| 亚洲国产日韩精品在线| 久久精品国产久精国产一老狼| 久久久久久91香蕉国产| 国产精品自产拍在线观看| 精品视频—区二区三区免费| 成人亚洲激情网| 国产中文欧美精品| 精品国产一区二区三区久久久狼| 欧美精品999| 日韩毛片中文字幕| 亚洲欧美日韩另类| 91精品视频在线播放| 久久国产天堂福利天堂| 久久久久久国产三级电影| 日韩美女免费观看| 日韩欧中文字幕| 亚洲精品国产精品久久清纯直播| 久久国产精品久久久久| 亚洲久久久久久久久久| 国产不卡在线观看| 久久久电影免费观看完整版| 国产91精品青草社区| 18久久久久久| 亚洲欧美日韩国产中文专区| 色老头一区二区三区| 久久久久久中文字幕| 欧美性感美女h网站在线观看免费| 久久久久久香蕉网| 久久成人免费视频| 精品亚洲夜色av98在线观看| 亚洲第一福利网| 精品国产一区二区三区久久狼5月| 国产97在线|亚洲| 国产精品香蕉av| 亚洲自拍偷拍色片视频| 国产成一区二区| 大伊人狠狠躁夜夜躁av一区| 91中文精品字幕在线视频| 日韩精品免费视频| 国产91精品视频在线观看| 91亚洲国产成人久久精品网站| 日韩精品免费电影| 亚洲视频999|