还珠格格之知画生孩子:转 axis 自定义对象序列化--阿甘正传1

来源:百度文库 编辑:九乡新闻网 时间:2024/04/28 18:53:24

基于Axis的自定义对象序列化

1. 在Axis服务端,注册自定义对象的序列化/反序列化器
主要是修改axis安装目录下WEB-INF/server-config.wsdd文件。

  
  
  
qname="ns:SimpleObject" xmlns:ns="urn:BeanService"/>
注意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
//服务端配置文件

xmlns="http://xml.apache.org/axis/wsdd/">
 
  
  
  
qname="ns:SimpleObject" xmlns:ns="urn:BeanService"/>
 




Service Styles

AXIS有四种service styles,分别是:RPC, Document, Wrapped, and Message。最常用的就是RPCMessage

RPCAXIS中是一个默认选项。当你部署的时候使用下列两种方式: 或则 ,它遵循SOAP RPC和编码规则,就是说它的WSDL文件形式就想上面所说的HelloServicewsForSoapechoString一样。每个RPC都包括一个表示名称的外部接点和一些表示参数的内部接点。AXIS会根据规则将一个XMLWSDL文件)文件转化成一个JAVA对象,并对对想赋上在文件中描述的值。也可以根据规则将一个JAVA对象转化成XML文件。

Document

以下列方式部署:。适合于老的XML schema。

Wrapped

以下列方式部署: 和DOCUMENT一样,适合于老的XML schema。

在大多书情况下,你不许要担心是DOCUMENT服务还是WRAPPED服务。

Message

以下列方式部署:。以这种方式部署的话,会是AXIS失去意义,它使你的代码真正的用XML形式,而不需要转化成JAVA对象。以这种方式部署的有以下四种服务方法:

public Element [] method(Element [] bodies);

public SOAPBodyElement [] method (SOAPBodyElement [] bodies);

public Document method(Document body);

public void method(SOAPEnvelope req, SOAPEnvelope resp);