首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Axis 自定義序列化/反序列化器開發指南:以 JDOM Element 為例

     編輯:Java 相關知識

背景

Axis 內置序列化器支持基本類型、集合、W3C DOM、JavaBean。對於不符合 Bean 規範的類(如 JDOM Element),需自行開發並注冊。

四大接口實現

角色接口/基類職責
序列化器工廠SerializerFactory / BaseSerializerFactory實例化序列化器
序列化器Serializer將 Java 對象轉為 XML 寫入 SerializationContext
反序列化器工廠DeserializerFactory / BaseDeserializerFactory實例化反序列化器
反序列化器Deserializer / DeserializerImpl從 XML 還原 Java 對象(SAX 事件驅動)

JDOM Element 實現代碼

1. SerializerFactory

public class JDomElementSerializerFactory extends BaseSerializerFactory {
    public JDomElementSerializerFactory() { super(JDomElementSerializer.class); }
}

2. Serializer 核心邏輯

public void serialize(QName name, Attributes attrs, Object value, SerializationContext ctx) throws IOException {
    if (!(value instanceof Element)) throw new IOException("Cannot serialize");
    Element root = (Element) value;
    // JDOM -> 字符串
    XMLOutputter out = new XMLOutputter();
    StringWriter sw = new StringWriter();
    out.output(root, sw);
    // 字符串 -> W3C DOM (Xerces)
    DOMParser parser = new DOMParser();
    parser.parse(new InputSource(new StringReader(sw.toString())));
    org.w3c.dom.Element w3cRoot = parser.getDocument().getDocumentElement();
    // 寫入 Axis 上下文
    ctx.startElement(name, attrs);
    ctx.writeDOMElement(w3cRoot);
    ctx.endElement();
}

3. DeserializerFactory

public class JDomElementDeserializerFactory extends BaseDeserializerFactory {
    public JDomElementDeserializerFactory() { super(JDomElementDeserializer.class); }
}

4. Deserializer (onEndElement)

public void onEndElement(String ns, String local, DeserializationContext ctx) throws SAXException {
    MessageElement msgElem = ctx.getCurElement();
    if (msgElem != null) {
        // 獲取 W3C DOM Element
        org.w3c.dom.Element domElem = msgElem.getAsDOM();
        // W3C DOM -> JDOM
        DOMBuilder builder = new DOMBuilder();
        value = builder.build(domElem); // value 為繼承自 DeserializerImpl 的字段
    }
}

部署註冊

在 server-config.wsdd (服務端) 和客戶端 client-config.wsdd 中添加:

<typeMapping qname="ns:Element" xmlns:ns="https://jdom.org"
    type="java:org.jdom.Element"
    serializer="org.apache.axis.encoding.ser.JDomElementSerializerFactory"
    deserializer="org.apache.axis.encoding.ser.JDomElementDeserializerFactory"
    encodingStyle="" />

適用模式

同理可擴展至任意非 Bean 類型(如自定義集合、第三方模型對象),只需實現四個類並配置映射。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved