axis 自定义对象序列化,只使用了beanMapping,未说明typeMapping,arrayMapping (参考axis user guide)
基于Axis的自定义对象序列化
1. 在Axis服务端,注册自定义对象的序列化/反序列化器
主要是修改axis安装目录下WEB-INF/server-config.wsdd文件。
<service name="SimpleObjectService" provider="java:RPC">
<parameter name="allowedMethods" value="*"/>
<parameter name="className" value="com.whcyit.axis.SimpleObjectService"/>
<beanMapping languageSpecificType="java:com.whcyit.axis.SimpleObject"
qname="ns:SimpleObject" xmlns:ns="urn:BeanService"/>
</service>
注意service/beanMapping的定义。languageSpecificType中定义使用那个类, qname定义类的名称。
2. 在Axis客户端,注册自定义对象的序列化/反序列化器。
核心代码如下:
//创建调用对象
Service service = new Service();
Call call = null;
call = (Call) service.createCall();
//注册SimpleObject的序列化类型
QName qn = new QName("urn:BeanService","SimpleObject");
call.registerTypeMapping(SimpleObject.class, qn,
new BeanSerializerFactory(SimpleObject.class, qn),
new BeanDeserializerFactory(SimpleObject.class, qn));
全部代码示例如下:
//SimpleObject.java
//Web Service对象传递的对象,必需继承Serializable
package com.whcyit.axis;
import java.io.Serializable;
public class SimpleObject implements Serializable {
private static final long serialVersionUID = -6414428095965735488L;
private int i = 0;
private float f = 0.0f;
private String str = "";
public SimpleObject() {
}
public float getFloat() {
return f;
}
public void setFloat(float f) {
this.f = f;
} public int getInt() {
return i;
}
public void setInt(int i) {
this.i = i;
}
public String getString() {
return str;
}
public void setString(String str) {
this.str = str;
}
}
// SimpleObjectService.java
//服务程序
package com.whcyit.axis;
public class SimpleObjectService {
public String sayHello(String name) {
return "Hello " + name +"!";
}
public String getString(SimpleObject obj) {
System.out.println("SimpleObjectService getString invoked!");
return "return by serviced:"+obj.getString();
}
public SimpleObject createSimpleObject(int i,float f,String str) {
System.out.println("SimpleObjectService createSimpleObject invoked!");
SimpleObject so = new SimpleObject();
so.setInt(i);
so.setFloat(f);
so.setString(str);
return so;
}
}
// SimpleObjectClient.java
//客户端调用文件
package com.whcyit.axis;
import javax.xml.namespace.QName;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.ser.BeanDeserializerFactory;
import org.apache.axis.encoding.ser.BeanSerializerFactory;
public class SimpleObjectClient {
public static void main(String[] args) {
String ret = "";
try {
String wsdlUrl = "http://localhost:8080/axis/services/SimpleObjectService?wsdl";
String nameSpaceUri = "http://localhost:8080/axis/services/SimpleObjectService";
//创建调用对象
Service service = new Service();
Call call = null;
call = (Call) service.createCall();
//注册SimpleObject的序列化类型
QName qn = new QName("urn:BeanService","SimpleObject");
call.registerTypeMapping(SimpleObject.class, qn,
new BeanSerializerFactory(SimpleObject.class, qn),
new BeanDeserializerFactory(SimpleObject.class, qn));
//调用sayHello
System.out.println(">>>sayHello");
call.setOperationName(new QName(nameSpaceUri, "sayHello"));
call.setTargetEndpointAddress(new java.net.URL(wsdlUrl));
ret = (String) call.invoke(new Object[] { "liu2" });
System.out.println("return value is " + ret);
//调用getDesc
System.out.println(">>>getString");
SimpleObject so = new SimpleObject();
so.setString("hello!");
QName getDescQn = new QName(nameSpaceUri, "getString");
call.setOperationName(getDescQn);
call.setTargetEndpointAddress(new java.net.URL(wsdlUrl));
ret = (String) call.invoke(new Object[] { so });
System.out.println("return value is " + ret);
//调用createSimpleObject
System.out.println(">>>createSimpleObject");
QName getObjectQn = new QName(nameSpaceUri, "createSimpleObject");
call.setOperationName(getObjectQn);
call.setTargetEndpointAddress(new java.net.URL(wsdlUrl));
SimpleObject rtnSO = (SimpleObject) call.invoke(new Object[]
{ new Integer(1),new Float(0.1f),"liu2" });
System.out.println("return object " + rtnSO.getString());
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
/server-config.wsdd
//服务端配置文件
<?xml version="1.0" encoding="UTF-8"?>
<deployment xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"
xmlns="http://xml.apache.org/axis/wsdd/">
<handler type="java:org.apache.axis.handlers.http.URLMapper" name="URLMapper"/>
<service name="SimpleObjectService" provider="java:RPC">
<parameter name="allowedMethods" value="*"/>
<parameter name="className" value="com.whcyit.axis.SimpleObjectService"/>
<beanMapping languageSpecificType="java:com.whcyit.axis.SimpleObject"
qname="ns:SimpleObject" xmlns:ns="urn:BeanService"/>
</service>
<transport name="http">
<requestFlow>
<handler type="URLMapper"/>
</requestFlow>
</transport>
</deployment>
分享到:
相关推荐
- 指定了序列化和反序列化的类名,以及编码风格。 #### 四、总结 本文详细介绍了如何在Axis框架下实现自定义数组对象的处理。通过定义自定义对象类型、实现处理逻辑以及配置服务,可以有效地在Web服务中传递复杂的...
在`转 axis 自定义对象序列化--阿甘正传.htm`中,讨论的是如何将Java对象转换为字节流,以便在网络中传输或持久化存储。这涉及到Java的序列化机制,包括实现Serializable接口,以及自定义序列化逻辑。 4. **Oracle...
在这个"WebService Axis1.4接口服务序列/反序列复杂项目实例"中,我们将深入探讨如何在 Axis1.4 中处理复杂的参数、自定义实体对象的序列化与反序列化,以及客户端的复杂调用。 首先,让我们理解序列化和反序列化的...
Axis2支持对象序列化和反序列化,使得对象可以被转换为XML格式在网络间传输,然后在接收端反序列化回对象。这对于跨系统的业务对象交换非常有用。 接着,"传文件"是Web服务中一个重要的应用场景。在Axis2中,可以...
在Web服务中,有时我们需要传递更复杂的数据结构,如自定义对象或数组。Axis支持这种复杂类型的序列化和反序列化。我们需要确保这些对象正确实现了`Serializable`接口,并且在WSDL中定义了它们的XML Schema数据类型...
Axis2支持Java对象到XML的自动序列化和反序列化,这使得开发者无需手动处理XML编码和解析。 3. **bean与XML相互转化**:JavaBean是Java中常用的数据载体,它能被转化为XML用于数据交换。Axis2提供了便利的工具和API...
5. **XMLBeans或JAXB**:Apache Axis可以使用XMLBeans或JAXB(Java Architecture for XML Binding)进行对象到XML的映射,理解这两种技术的工作原理对于处理自定义类的序列化至关重要。 6. **SOAP绑定**:理解如何...
在这种情况下,需要使用如Apache CXF、Axis2等Web服务框架,它们提供了一套工具和服务描述语言(WSDL)来处理自定义类的序列化。 每种方法都有其适用场景和优缺点。例如,JAXB和SOAP更适合企业级的、强类型的服务,...
6. **序列化与反序列化**:AXIS2使用XMLBeans或Aegis库进行对象到XML的序列化和反序列化,这是在处理SOAP消息时的关键步骤。 7. **模块系统**:AXIS2的模块系统允许用户插入自定义的功能,如安全、事务管理等,以...
5. **序列化与反序列化(Serialization & Deserialization)**:Axis2 使用Axiom(抽象XML消息对象模型)处理XML消息的序列化和反序列化。源码分析有助于理解数据如何在SOAP消息和Java对象间转换。 6. **部署...
- **编码您的 Beans**:介绍了如何使用 Bean 序列化功能来编码 Java 对象。 - **当 Beans 不够时 - 自定义序列化**:如果默认的序列化机制不能满足需求,可以使用自定义序列化来实现更复杂的需求。 #### 八、使用 ...
这个类实现了`Serializable`接口,这是因为在Web服务中,对象需要能够被序列化和反序列化以便在网络间传输。`Student`类包含了三个私有属性:`_name`、`_id`和`_comment`,以及相应的getter和setter方法。 接着,...
源码包含了许多模块,如核心引擎、传输层、消息处理、序列化和反序列化等。通过对源码的学习,开发者可以更好地理解 Axis2 如何处理SOAP消息,如何实现服务的生命周期管理,以及如何与其他Web服务框架互操作。 最后...
在Web服务上下文中,它支持SOAP消息中的对象激活和序列化。 4. **axis-ant.jar**:这个库文件包含了Ant任务,Ant是Apache的构建工具,用于自动化Java项目构建过程。axis-ant.jar让开发者可以利用Ant脚本来执行Axis...
6. **类型映射**:Axis支持自动的Java类型到SOAP数据类型的映射,使得数据在传输过程中能够保持类型一致性,同时处理XML数据的序列化和反序列化。 7. **扩展与插件**:Apache Axis有一个强大的插件系统,允许开发者...
Axis2深度集成SOAP处理,包括解析、序列化和处理SOAP消息。源码解析有助于理解SOAP消息的生命周期和处理流程。 6. **WSDL处理**: Axis2能够根据WSDL文件自动生成服务代码,源码里可以看到WSDL解析器的工作原理。...
7. **数据绑定**:Axis 1.4支持数据绑定技术,如JAXB(Java Architecture for XML Binding),可以将XML Schema映射到Java类,简化了XML数据的序列化和反序列化。 8. **模块与扩展**:Axis 1.4支持模块系统,允许...
Axis2 1.4版本在性能上做了很多优化,包括缓存机制、多线程处理和高效的序列化/反序列化策略,以应对高负载和大规模服务场景。 9. **扩展性** Axis2允许通过编写自定义模块和扩展点来扩展其功能。开发者可以创建...
3. 生成的代码:通常包括服务端的Stub(存根类)和客户端的Skeleton(骨架类),这些类负责处理SOAP消息的序列化和反序列化。 4. 部署服务:将生成的服务端代码部署到Axis2服务器上,使其可以接受和响应Web服务请求...
在Web服务接口中,这些复杂对象可以通过XML Schema(XSD)来定义,然后由Axis自动处理序列化和反序列化的过程,使得客户端和服务器之间能够顺利交换数据。 4. **RMI (Remote Method Invocation) 远程调用**:RMI是...