序列化与反序列化 WS中的序列化与反序列化是指java对象与xml之间的相互转换,意即如果传输的数据是java对象,例如基本数据类型的包装类,自定义的义务类、集合等,客户端服务端需要显示注册序列化器和反序列化器。而利用axis开发的WS应用,是以“映射”的方式来体现这一点的,所以像axis这样的引擎也被称为OXM--Object XML Mapping。 服务端,如果程序运行时报错“faultString: java.io.IOException: No serializer found for class cn.itcast.myaxis.service.pojo.Customer in registry org.apache.axis.encoding.TypeMappingDelegate@b9b618”,则很可能是服务端没有声明java对象与xml的映射,例如<beanmapping qname="ns:Customer" xmlns:ns="urn:customer:pojo:service:itcast:cn" languagespecifictype="java:cn.itcast.myaxis.service.pojo.Customer"></beanmapping>,有几个对象就需要有几个映射声明,作为<service>的子元素。 beanMapping是axis引擎自带的序列化器,typeMapping则允许用户自定义序列化器,但是beanMapping可以认为是typeMapping的快捷方式,因为typeMapping默认的就是beanMapping,数组用arrayMapping,不过一般情况下数组的序列化不用显示声明也可以。 有的集合类,比如hashtable确实有序列化器,但和其他的soap实现没有正规的交互;SOAP规范也没有设计复杂对象。可靠的方式就是使用数组发送集合对象(但.Net不能处理他们)。不过有些java的SOAP实现支持hashtable的组装和拆解. 客户端,如果程序运行时报错“org.xml.sax.SAXException: Deserializing parameter ''getCustomerReturn'': could not find deserializer for type {urn:customer:pojo:service:itcast:cn}Customer”,则需要显示声明注册映射信息,示例代码如下: + expand sourceview plain 如果代码call.invoke(new Object[]{5})没有被赋予对象Object o,在该句添加断点,调试运行时用watch查看该元素,会发现报错“com.sun.jdi.InvalidTypeException: Generated value (int) is not compatible with declared type (java.lang.Object). occurred while setting value in array.”这是因为如果没有强制转换赋值的话,可能不能调用通过注册的序列化器和反序列化器,所以会报错。 如果是集合类的,采用上述方法即可。不过有的时候还要看jdk版本。我用的jdk6u18,无论是否有泛型,返回list采用上述代码都可以;但是map没有泛型的话,还是会报错“No deserializer for {http://schemas.xmlsoap.org/soap/encoding/}string”,需要添加代码显示声明EncodingStyle(jdk6u16就不需要这么做): call.setEncodingStyle ("http://schemas.xmlsoap.org/soap/encoding/");或者--> call.setEncodingStyleType ("http://schemas.xmlsoap.org/soap/encoding/")--看axis的版本了。 RMIException(映射到SOAP Fault)不注册也可以被序列化,但是信息不全,所以最好还是序列化,可以用TCP/IP Monitor查看响应信息来验证。 文件上传与下载 直接编码用byte[]的方式上传下载文件也可以,但是性能差,尤其传输大文件的时候--用TCP/IP Monitor可以看到传输的文件是一次性传输,打个比方来说就像是用一辆大卡车在一条马路上运送一批货物,可以想到,如果此时该马路上还有其他卡车需要运送货物的话,很容易造成交通堵塞。所以,WS的实际应用中文件的上传下载是采用MIME方式,包装成DataHandle传输,相当于一批货物分散到多个小卡车依序在一条马路上运输,而这需要activation.jar和mail.jar包的支持。 axis中文件的上传下载是放到MessageContext环境中的。下面是用MIME方式上传文件的示例代码:</service>
详细解决方案
传智播客-web service(7)-序列化与反序列化、文件下传与上载
热度:827 发布时间:2012-11-01 11:11:31.0
序列化与反序列化 WS中的序列化与反序列化是指java对象与xml之间的相互转换,意即如果传输的数据是java对象,例如基本数据类型的包装类,自定义的义务类、集合等,客户端服务端需要显示注册序列化器和反序列化器。而利用axis开发的WS应用,是以“映射”的方式来体现这一点的,所以像axis这样的引擎也被称为OXM--Object XML Mapping。 服务端,如果程序运行时报错“faultString: java.io.IOException: No serializer found for class cn.itcast.myaxis.service.pojo.Customer in registry org.apache.axis.encoding.TypeMappingDelegate@b9b618”,则很可能是服务端没有声明java对象与xml的映射,例如<beanmapping qname="ns:Customer" xmlns:ns="urn:customer:pojo:service:itcast:cn" languagespecifictype="java:cn.itcast.myaxis.service.pojo.Customer"></beanmapping>,有几个对象就需要有几个映射声明,作为<service>的子元素。 beanMapping是axis引擎自带的序列化器,typeMapping则允许用户自定义序列化器,但是beanMapping可以认为是typeMapping的快捷方式,因为typeMapping默认的就是beanMapping,数组用arrayMapping,不过一般情况下数组的序列化不用显示声明也可以。 有的集合类,比如hashtable确实有序列化器,但和其他的soap实现没有正规的交互;SOAP规范也没有设计复杂对象。可靠的方式就是使用数组发送集合对象(但.Net不能处理他们)。不过有些java的SOAP实现支持hashtable的组装和拆解. 客户端,如果程序运行时报错“org.xml.sax.SAXException: Deserializing parameter ''getCustomerReturn'': could not find deserializer for type {urn:customer:pojo:service:itcast:cn}Customer”,则需要显示声明注册映射信息,示例代码如下: + expand sourceview plain 如果代码call.invoke(new Object[]{5})没有被赋予对象Object o,在该句添加断点,调试运行时用watch查看该元素,会发现报错“com.sun.jdi.InvalidTypeException: Generated value (int) is not compatible with declared type (java.lang.Object). occurred while setting value in array.”这是因为如果没有强制转换赋值的话,可能不能调用通过注册的序列化器和反序列化器,所以会报错。 如果是集合类的,采用上述方法即可。不过有的时候还要看jdk版本。我用的jdk6u18,无论是否有泛型,返回list采用上述代码都可以;但是map没有泛型的话,还是会报错“No deserializer for {http://schemas.xmlsoap.org/soap/encoding/}string”,需要添加代码显示声明EncodingStyle(jdk6u16就不需要这么做): call.setEncodingStyle ("http://schemas.xmlsoap.org/soap/encoding/");或者--> call.setEncodingStyleType ("http://schemas.xmlsoap.org/soap/encoding/")--看axis的版本了。 RMIException(映射到SOAP Fault)不注册也可以被序列化,但是信息不全,所以最好还是序列化,可以用TCP/IP Monitor查看响应信息来验证。 文件上传与下载 直接编码用byte[]的方式上传下载文件也可以,但是性能差,尤其传输大文件的时候--用TCP/IP Monitor可以看到传输的文件是一次性传输,打个比方来说就像是用一辆大卡车在一条马路上运送一批货物,可以想到,如果此时该马路上还有其他卡车需要运送货物的话,很容易造成交通堵塞。所以,WS的实际应用中文件的上传下载是采用MIME方式,包装成DataHandle传输,相当于一批货物分散到多个小卡车依序在一条马路上运输,而这需要activation.jar和mail.jar包的支持。 axis中文件的上传下载是放到MessageContext环境中的。下面是用MIME方式上传文件的示例代码:</service>
相关解决方案
- 小弟我想做一个多功能web service client
- Servlet.service() for servlet [jsp] in context with path解决方案
- web service 第一天接触不懂 仍是那个访问天气预报的例子 代码很简单
- Web Service 错误:服务器未能识别 HTTP 头 SOAPAction 的值: http://tempuri.org/
- web service No services have been found.解决方法
- 学习Web Service,用哪种框架好?AXIS,XFire,CXF?该如何处理
- java service 项目有关问题
- 对象集,数组,web service,该怎么解决
- org.apache.catalina.core.ApplicationDispatcher invoke Servlet.service() for se解决思路
- JMS:Java讯息服务(Java Message Service)初学笔记
- 新手学习j2me,请教调用.net service 时用ksoap,还是用JSR172好
- WCF service 下传订单文件到ftp
- 请教:有人开发过OPOS驱动吗,撰写 service object?
- vc写的 windows service 控制台程序有关问题
- 请教一上有没有C++调用WEB SERVICE 做成DLL的例子
- vs2008中怎么使用vc++构建web service
- 客户端用vc2005的c++来编写,web service 只是连接就报错解决方法
- Reporting service 中使用储存过程有关问题
- Reporting Service 报表订阅 到win2003 系统的有关问题
- Reporting Service 分组排列有关问题
- Silverlight学习数据跟RIA服务时,找不到domain service class模板
- 生手学习web service
- asp reporting service 只显示一起,大神进
- ajax怎么调用带有SoapHeader的 web service
- ASP.NET web service 中 怎么保持状态
- !AJAX的autocompleteextender控件实现自动输入一定需要Web Service
- 无法打开登录所请求的数据库 "xxx"登录失败用户 'NT AUTHORITY\NETWORK SERVICE' 登录失败解决方案
- |zyciis| C# 怎么制作 Windows2003 IIS6 和 Meida Service 的自动安装程序
- “LINQ”提供“Service”服务的疑问解决办法
- 关于web service 的一些疑问?该如何解决