序列化与反序列化 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)-序列化与反序列化、文件上传与下载
最新推荐文章于 2024-01-26 20:27:22 发布