Webservice SOAP传输序列化总结最近在接触Webservice,在使用SOAP协议远程调用本地返回自定义类对象的[WebMethod]方法时总是出错,百度Google后解决问题,现总结如下:
一.所有Webservice中传递的对象都必须能够序列化,这个是作为在网络之间传输的必要条件。XML WebService和SOAP标准支持的数据类型如下:
1.基本数据类型.
标准类型,如:int float bool DateTime string等基本数据类型
2.枚举.
支持枚举Enum定义的类型
3.自定义对象.
可以传递任意基于自定义类或结构创建的对象。 但要注意一点: 它只能传输数据成员(变量和属性).
如果定义了方法,则方法不能进行序列化传输,序列化后只剩下数据成员.
4.DataSet对象
支持DataSet,切记:不支持DataTable和DataRow,DataSet已经是XML Webservice能够支持的最小的可序列化对象.
5.XmlNode对象
基于XmlNode的对象可以表示XML文档的一部分.
6.数组和集合
可以使用任何被支持的类型的数组和简单集合,包括: DataSet对象/XmlNode对象和自定义对象.
不知道读者有没有遇到这种情况,在调用WebService并给一个方法传递了一个DataRow参数时,运行时会抛出异常: "没法将参数序列化!",如果把DataRow加入到DataSet中,并将DataSet作为参数传递再运行就OK了。 这是因为:XML WebService只能对数据集DataSet对象类型进行XML序列化,不能对DataRow对象类型进行XML序列化造成的错误.因此了解一下XML WebService支持序列化的基本数据类型是比较重要的.
除了上述的基本类型以为,Webservice服务不能完成直接序列化传输,但是大部分数据结构借助序列化,仍然可以在Webservice上传输。
例如:
在将一个自定义类序列化到文件时,出现如下错误提示:
System.Reflection.TargetInvocationException: 调用的目标发生了异常。 --->
System.InvalidOperationException: 生成 XML 文档时出错。 ---> System.InvalidOperationException:
不应是类型 Alink.T1System.Windows.PrintSetting。使用 XmlInclude 或 SoapInclude 属性静态指定非已知的类型。
经查找资料,发现当被序例化的类中包含自定义的复杂类时,需要使用XmlIncludeAttribut属性标识自定义类
现在修改如下:
using System.Xml.Serialization;
[XmlInclude(typeof(自定义类))]
[Serializable]
public class MyDIYClass
自定义的类都添加标记,提供的webservice方法也加标记
[WebMethod]
[XmlInclude(typeof(自定义类))]
public object WebServiceMethod(Object requestObj)
要把该类中内含的自定义类都用XmlInclude一次,就可以解决问题了;
这样就可以传输了,List<>,ArrayList对象都可以传输,但是返回类型为ArrayList的[WebMethod]方法,在客户端调用后,得到的是object数组,而且object中的property全部都变为field。另外,接口也不能序列化例如List<Interface>也是不能序列化的,遇到这种情况可以把接口修改为抽象类,同时在抽象类上添加[XmlInclude]属性,最后需要注意一点,自己写的类要想序列化必须有默认构造函数(不带参数的构造函数)。
xml序列化答疑:
(1)需序列化的字段必须是公共的(public)
(2)需要序列化的类都必须有一个无参的构造函数
(3)枚举变量可序列化为字符串,无需用[XmlInclude]
(4)导出非基本类型对象,都必须用[XmlInclude]事先声明。该规则递归作用到子元素
如导出ArrayList对象,若其成员是自定义的,需预包含处理:
using System.Xml.Serialization;
[XmlInclude(typeof(自定义类))]
(5)Attribute中的IsNullable参数若等于false,表示若元素为null则不显示该元素。
也就是说:针对值类型(如结构体)该功能是实效的
若数组包含了100个空间,填充了10个类对象,则序列化后只显示10个节点
若数组包含了100个空间,填充了10个结构体对象,则序列化后会显示100个节点
(6)真正无法XML序列化的情况,某些类就是无法XML序列化的(即使使用了[XmlInclude])
IDictionary(如HashTable)
System.Drawing.Color
System.Drawing.Font
SecurityAttribute声明
父类对象赋予子类对象值的情况
对象间循环引用
(7)对于无法XML序列化的对象,可考虑使用自定义xml序列化(实现IXmlSerializable接口)实现IDictionary的类,可考虑
(1)用其它集合类替代;(2)用类封装之,并提供Add和this函数
某些类型需要先经过转换,然后才能序列化为 XML。如XML序列化System.Drawing.Color,可先用ToArgb()将其转换为整数,过于复杂的对象用xml序列化不便的话,可考虑用二进制序列化。
答疑引自http://hi.baidu.com/asheng99012/blog/item/b6e1a63b624fc9f014cecbeb.html
分享到:
相关推荐
序列化是将对象的状态转换为可以存储或传输的数据格式的过程,例如XML、JSON或二进制。在Web服务上下文中,序列化特别重要,因为它允许我们将Java对象或.NET对象转换为可以在网络上传输的格式。对于复杂的对象结构,...
Web服务通常采用SOAP(Simple Object Access Protocol)或RESTful API的形式,其中SOAP常常涉及到对象的序列化和反序列化。对象序列化是将Java对象转换为可以在网络上传输的格式(如XML或JSON)的过程,而反序列化则...
本示例“android webservice 对象序列化例子”关注的就是如何在Android应用中处理这一过程。 **对象序列化** 是将Java对象转换为可以存储或传输的数据格式的过程。在Android中,这通常是将对象转换为XML或JSON字符...
序列化是计算机科学中的一个重要概念,尤其是在Web服务领域,它指的是将复杂的数据结构或者对象状态转换为可以存储或传输的格式的过程;而反序列化则是其逆过程,即将序列化后的数据恢复为原来的数据结构或者对象。...
总结,Android调用WebService并使用JSON传递实体对象涉及到多个步骤,包括选择合适的库(如ksoap2和Newtonsoft.Json),理解数据序列化和反序列化的过程,以及正确设置HTTP通信。通过这种方式,你可以高效地在客户端...
4. **SOAP和RESTful的区别**:根据Web Service的类型(SOAP或REST),序列化和反序列化的机制可能会有所不同。SOAP通常使用WSDL(Web Services Description Language)描述服务接口,而REST则倾向于使用JSON或XML...
此外,`SoapSerializationEnvelope`是一个特殊的`SoapEnvelope`实现,特别适用于RPC模式,它可以自动处理Java对象的序列化和反序列化。 在实际应用中,使用Apache SOAP调用Web服务通常涉及以下步骤: 1. 创建`Soap...
"webservice soap wsdl" Web Service 是一种网络接口,为应用程序提供了交互和分布式处理的效果,与平台、开发语言无关。Web Service 的核心是 WSDL(Web Services Description Language),它是一种用于描述 Web ...
**XMLSerializer** 是 ASP.NET 中 WebService SOAP 请求的默认序列化方式。它主要用于序列化对象的公共属性和成员,并将这些信息以 XML 的形式表示出来。这种方式易于阅读且格式统一,非常适合于跨平台的数据交换。 ...
在这个"WebService Axis1.4接口服务序列/反序列复杂项目实例"中,我们将深入探讨如何在 Axis1.4 中处理复杂的参数、自定义实体对象的序列化与反序列化,以及客户端的复杂调用。 首先,让我们理解序列化和反序列化的...
3. **数据绑定**:通过JAXB和Aegis,Xfire可以方便地将Java对象与XML数据进行绑定,简化了数据的序列化和反序列化过程。 4. **MTOM/XOP**:Xfire支持Message Transmission Optimization Mechanism (MTOM)和XML-...
在C#、C++以及C#(也就是.NET框架中的SOAP支持)中,SOAP序列化是将对象转换为可以发送通过网络的XML消息的过程,而反序列化则是将接收到的XML消息恢复为原始对象的过程。 在C#中,SOAP序列化是.NET框架的一部分,...
这不仅涉及网络通信的基本原理,还包括API设计的最佳实践、数据序列化与反序列化、错误处理和安全策略等多个方面。对于"n_dongshifang-smsWebForm"这样的具体项目,深入学习和实践将有助于提升开发者在实际工作中的...
在IT行业中,Web服务(Web Service)...总之,解决Xfire调用Web服务参数传递问题需要对XML序列化、SOAP协议、命名空间、SOAP绑定配置和安全机制有深入理解。通过细心排查和调试,我们一定能找到问题的根源并成功修复。
SDK中的组件可能包括解析和序列化XML的工具,以及处理HTTP传输的模块,这些都是SOAP通信的基础。 标签"soap SDK"进一步强调了这个压缩包与SOAP开发工具包的关联,表明内容可能包含与使用和配置SOAP SDK相关的资源。...
然而,WebService通信的基础是XML或JSON,这些格式要求传输的数据能够被序列化和反序列化。默认情况下,只有基本数据类型和某些标准库中的对象可以直接进行序列化。自定义类的处理则需要额外的策略。本文将详细讲解...
这说明在WebService中,数据在客户端和服务端之间的传输通常需要通过序列化和反序列化来转换为适合网络传输的格式。 4. **方法分发机制** 文档还展示了使用switch-case结构来实现方法分发的逻辑,这是WebService...
在SOAP通信中,JAXB用于将Java对象序列化为XML消息,以及反序列化XML回Java对象。对应的jar文件可能包括`jaxb-api.jar`、`jaxb-runtime.jar`等。 5. **SOAP绑定**:SOAP支持多种绑定,包括HTTP、HTTPS、SMTP等。...
WCF提供了更高级的功能,如多种绑定和协议,以及更灵活的数据序列化。 总之,在C#中创建和使用Web服务返回数组和二进制数据涉及XML序列化、HTTP请求和响应处理。理解这些基本概念对于任何进行跨平台通信的开发者来...
DataSetSurrogate是一种优化技术,通过自定义的类来代替DataSet进行序列化和反序列化,从而减少数据传输量,尤其适用于大数据集的压缩。 5. **Solution**文件:在.NET开发中,"Solution"文件是一个包含项目集合的...