关于axis1.2中对象的序列化和发序列化
我从开始使用wtp来开发web service开始, 就在思考一个问题:
那些java的对象是可以序列化为xml的, 并且可以从xml反序列化为java对象的?
那些对象与xml之间不能够序列化和反序列化?
在开发的时候应该注意哪些问题?
根据我的理解, 有如下几种对象:
1)axis1.2内在支持的几种对象类型。
这几种内在支持的对象包括:
java基本类型 : int, float,,,,
基本类型包装类 : Integer, Float, Long...
还有String, Date, Calendar, BigDecimal, BigInteger, List, Map.
凡是这些内在支持的对象, 不管他们作为某个Service的input 还是 output, 我们在服务端的axis1.2的WEB-INF/server-config.wsdd的该Service的定义中都不需要加入<beanMapping>或者是<typeMapping>的声明。
2)简单的javabean对象类型。
对于简单的javabean对象, 比如对象中所有的field都是上面提到的基本类型。 axis1.2也提供了很好的支持。
比如:
public class JavaBeanInputService {
public void testJavaBeanInput(MyBean bean) {
......
}
}
由于MyBean是一个自定义的JavaBean对象, 所以在server-config.wsdd中就必须加上<beanMapping ...../>的声明, 让axis知道怎么把request中xml数据deserialize为MyBean对象, 又如何把MyBean对象serialize为xml数据作为response.用wtp自动为JavaInputService生成的wsdl中, MyBean是作为一个complexType在wsdl中定义的。
3)复杂一点的JavaBean对象。
比如JavaBean对象中的一些field又是自定义的JavaBean, 这种情况下, wsdl中生成的complextype会有多个, 而在wsdd定义的<beanMapping .../>也会有多个, axis1.2支持起来都是易如反掌。
4)普通的非javabean对象。
对于一些不是javaBean的对象, wtp也会替你生成对应的wsdl的ComplexType, 依据的是对象的getter方法。但是显然这是不够的。 比如说有些对象的数据结构比较复杂, 像java.util.HashMap(虽然这个已经被axis内在支持了。)这些对象如果想要把自己的状态进行serialization和deserialization, 就得自己编写serializer和deserializer, 而且还必须保证wsdl中的该complexType的描述是正确的。
5)java中的List, Map问题。
试想一下如果一个service的样子是这样子的。
public class ListService{
public List listTest(List list) {
for(Iterator iter = list.iterator(); iter.hasNext(); ) {
(MyBean)list.next();//进行强转。
}
}
}
用wtp为这个service生成的wsdl中把list映射为一个type为xsd:anyType的maxOccurs="unbound"的complexType。这样的话客户端生成的Stub中的接口中类似于:
public interface ListService{
public Object[] listTest(Object[] list) ;
}
如果Client端用户传递的入口参数是String[],那么在服务端执行的必然会发生转型错误。
因此,在webservice中把List, Map作为service的input, output的做法都是不可行的。至少在jdk1.4的版本中是这样的。
一个更好的方法就是:
6)java中的数组。
上例中的ListService如果改造为下面这样,基本上就没有上面提到的问题了。
public class ListService{
public MyBean[] listTest(MyBean[] list) {
...
}
}
这样在wsdl中, MyBean被映射为一种ComplexType,MyBean[]为映射为ComplexType为映射为可以重复出现的MyBean类型。在客户端的Stub的接口跟这个也是类似的。从而也成功地避免了List, Map中型别问题。
要注意的是,在server-config.wsdd中需要配置<arrayMapping.../>
似乎List, Map的问题用数组就可以解决了。事实上就是如此。但是还得注意的是:
javabean里边也不能含有List. 如果MyBean跟其它某个对象是1:n的关系,那么也只能写成数组的形式,而不能是List的形式。
7)特殊对象java.lang.Object
如果一个service写成了下面的形式:
public class ObjectService{
public Object objInvoke(Object obj) {
...
}
}
想把它发布为web service, 那么几乎是不太可能的。遇到obj类型,wsdl里边只能定义为xsd:anyType类型,而这种类型如果给客户端返回一个比如MyBean类型,那么必然会导致xml的serialization的失败。结论就是:
web service中如果input 或者是output是java.lang.Object类型,那么将会导致严重问题。
上面的几种对象类型基本上能够涵盖将java class发布为web service时需要考虑的对象类型。可以看到开发web service的时候,并不是所有的java都能够轻而易举地发布为web service, 一些复杂的类的对象类型,还有一些特殊的对象类型都是要考虑的。最后一个问题是:子类是否也很容易的得到序列化和反序列化?
答案是肯定的。如下的Service:
public class PolymorphicService{
public MyBean objInvoke(MyBean obj) {
...
}
}
客户端的Stub如下:
public class PolymorphicServiceStub{
public MyBean objInvoke(MyBean obj) {
...
}
}
如果在客户端调用stub时传入的不是MyBean类的对象,而是它的子类的一个对象,那么也可以被序列化而传到服务端。同样,如果服务端返回的对象是MyBean类的字类的一个对象,也可以成功的被序列化到客户端。
分享到:
相关推荐
在本文中,我们将深入探讨Xfire调用Web服务时遇到的参数传递问题以及解决策略。 首先,让我们了解Web服务的基本概念。Web服务基于SOAP(Simple Object Access Protocol)协议,通过HTTP协议进行通信,使得不同的...
**WebService CXF 对象传递详解** 在Web服务领域,CXF是一个非常重要的开源框架,它允许开发者创建和消费各种Web服务。CXF支持SOAP、RESTful等多种通信模式,并且能够处理复杂的对象传递,使得Web服务的数据交换...
3. 在Java客户端,调用WebService方法并将JSON格式的字符串作为参数传递给服务端。这个字符串将被序列化为SOAP消息,然后通过网络发送给WebService端点。在客户端代码中,一般需要有一个客户端代理类,这个代理类...
在这个场景中,POST方法用于传递调用WebService所需的参数。 3. **XML**:XML是一种自描述性的文本标记语言,用于存储和传输数据。在与WebService交互时,XML常被用来封装请求参数和返回的数据。 4. **调用...
总之,调用WebService参数涉及对WSDL的理解、客户端代理类的生成以及正确设置和传递参数。在实际开发中,确保正确理解和使用这些参数是成功调用WebService的关键。对于"WEBgangcai"的具体内容,如果没有更多信息,...
你可以直接将这些值作为参数传递给WebService,同时也可以作为返回值接收。例如,如果你有一个获取用户ID的WebService方法,可以这样在Android端调用: ```java // 创建SoapObject并设置参数 SoapObject request = ...
WINFORM调用webservice传递可序列化对象示例C井版WINFORM调用webservice传递可序列化对象示例C井版WINFORM调用webservice传递可序列化对象示例C井版WINFORM调用webservice传递可序列化对象示例C井版
本资源"WebService传递对象与集合问题.rar"显然关注的是在Web Service中如何有效地传递复杂数据类型,如对象和集合。 在传统的Web Service中,数据通常通过XML格式进行传输,这是SOAP消息的基础。然而,直接传递...
这个工程详细的介绍了webService服务客户端如何调用简单和复杂的webService,其中就包括传递的参数是对象类型,返回数据是数组类型,还有最简单的基本类型。压缩包里还配置说明,清晰的说明webService的整个过程,对...
本文将深入探讨Xfire调用Web服务时遇到的参数传递问题以及解决方案。 首先,我们需要理解Web服务的基本工作原理。Web服务通常基于SOAP(Simple Object Access Protocol)协议,通过HTTP协议进行通信。SOAP消息封装...
在实际项目中,可以根据需求选择不同的Web服务框架,如JAX-WS(Java API for XML Web Services)或Spring-WS等,但基本的调用和参数传递原理是相似的。对于压缩包中的`webServicePro`文件,它可能包含了完整的代码...
Web Service提供者 参数写在对象中(参数为对象)
本主题的核心是"拼接XML调用WebService",这通常指的是通过构建XML字符串来构造请求,然后发送该请求到一个Web Service接口以获取响应。以下是对这个过程的详细解释: 1. **XML基础**:XML是一种结构化标记语言,它...
在调用复杂服务或传递实体类时,可能会遇到参数传递的问题。Android客户端发送的SOAP请求可能无法被WCF服务端正确解析。这通常是因为对象的命名空间(namespace)不匹配。例如,在服务端定义了一个User类,并期望...
本压缩包“C#Post带参数请求+WebService接口.zip”提供了关于如何使用C#进行POST请求并调用WebService接口的相关代码示例。下面我们将深入探讨这两个核心知识点。 1. **C# 带参数POST请求**: 当需要向服务器发送...
总结,这个例子是一个很好的学习资源,它覆盖了CXF框架下Web服务端和客户端的创建、参数传递、测试等核心知识点。对于初学者而言,通过实践这个demo,可以深入理解Web服务的工作原理,以及CXF框架的使用方式。在实际...
本主题主要探讨如何在Java环境中调用.NET的Web服务,特别是传递字符串参数。我们将深入讲解两种主流的方法:Axis和XFire。 **一、 Axis** 1. **Axis简介**: Axis是Apache软件基金会的一个开源项目,它提供了一套...
本文档重点介绍了如何使用ksoap2库调用Web Service服务,包括不同类型的参数传递方法。 1. Web Services简介 Web Services是一种基于开放Web标准,特别是XML的互联网应用程序。它们可以通过HTTP协议进行通信,允许...
要调用Web Service并传递XML数据,可以使用`SoapHttpClientProtocol`类的派生类。以下代码展示了如何调用上面创建的Web Service接口: ```csharp using System.Net; using System.IO; using System.Xml; ...
axis1_4 发布webservice 传递对象或返回对象(一)_benet6_新浪博客.mht