Axis 內置序列化器支持基本類型、集合、W3C DOM、JavaBean。對於不符合 Bean 規範的類(如 JDOM Element),需自行開發並注冊。
| 角色 | 接口/基類 | 職責 |
|---|---|---|
| 序列化器工廠 | SerializerFactory / BaseSerializerFactory | 實例化序列化器 |
| 序列化器 | Serializer | 將 Java 對象轉為 XML 寫入 SerializationContext |
| 反序列化器工廠 | DeserializerFactory / BaseDeserializerFactory | 實例化反序列化器 |
| 反序列化器 | Deserializer / DeserializerImpl | 從 XML 還原 Java 對象(SAX 事件驅動) |
public class JDomElementSerializerFactory extends BaseSerializerFactory {
public JDomElementSerializerFactory() { super(JDomElementSerializer.class); }
}
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();
}
public class JDomElementDeserializerFactory extends BaseDeserializerFactory {
public JDomElementDeserializerFactory() { super(JDomElementDeserializer.class); }
}
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 類型(如自定義集合、第三方模型對象),只需實現四個類並配置映射。