Webservice SOAP传输序列化总结(转)

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

追述:

framework 2.0后

异常类Exception就不能被XML序列化了。

因为有了个成员Data的属性是System.Collections.IDictionary

时间: 2024-10-11 05:26:30

Webservice SOAP传输序列化总结(转)的相关文章

Webservice soap wsdl的区别

Web Service完结业务诉求:Web Service是真实“就事”的那个,供给一种就事接口的总称.WSDL供给“能办的事的文档阐明”:对要供给的效劳的一种描绘格局.我想帮你的忙,但是我要通知你我都能干啥,以及干这些工作需求的参数类型.SOAP供给“恳求”的规范:向效劳接口传递恳求的格局,包括办法和参数等.你想让人家就事,总得通知人家你想干啥吧,SOAP即是界说这个“恳求”的格局的,按照SOAP界说的“恳求”格局“书写”恳求就能够确保Web Service能够正确的解读你想让它干啥以及你为它

C# 调用Webservice并传递序列化对象

原文:C# 调用Webservice并传递序列化对象 C#动态调用WebService注意要点 1.动态调用的url后面注意一定要加上?WSDL   例如:string _url = "http://服务器IP:端口/CITI_TRANS_WH/wsTransData_InWH.asmx?WSDL"; ---------------------------------------------------------------------------------------------

C# 序列化与反序列化Serialization之Json Xml Binary Soap JavaScript序列化

所谓的序列化其实就是把一个内存中的对象信息转化成一个可以持久化保存的形式,方便保存数据库和文件或着用于传输, 序列化的主要作用是不同平台之间进行通信与信息的传递保存等,常用的有序列化有Json Xml Binary Soap JavaScript序列化等,当然我们也可以使用第三方的序列化类库,第三方的序列化类库可以参照网上的,这里不再赘述, 本文主要介绍Json Xml Binary Soap JavaScript等6种序列化的方法, 添加引用以下类库 using System.Runtime.

【&#127568;】 彻底理解webservice SOAP WSDL

原文: http://wenku.baidu.com/view/f87b55f19e31433239689314.html WebServices简介 先给出一个概念 SOA ,即Service Oriented Architecture ,中文一般理解为面向服务的架构, 既然说是一种架构的话,所以一般认为 SOA 是包含了运行环境,编程模型, 架构风格和相关方法论等在内的一整套新的分布式软件系统构造方法和环境, 涵盖服务的整个生命周期.而在 SOA 的架构风格中,服务是最核心的抽象手段. SO

彻底理解webservice SOAP WSDL

WebServices简介 先给出一个概念 SOA ,即Service Oriented Architecture ,中文一般理解为面向服务的架构, 既然说是一种架构的话,所以一般认为 SOA 是包含了运行环境,编程模型, 架构风格和相关方法论等在内的一整套新的分布式软件系统构造方法和环境, 涵盖服务的整个生命周期.而在 SOA 的架构风格中,服务是最核心的抽象手段. SOA 中的服务是构建在一些列基于开放标准的基础之上的, Web 服务定义了如何在异构系统之间实现通信的标准化方法, 从而就使得

理解WebService SOAP WSDL

WebServices简介 先给出一个概念 SOA ,即Service Oriented Architecture ,中文一般理解为面向服务的架构, 既然说是一种架构的话,所以一般认为 SOA 是包含了运行环境,编程模型, 架构风格和相关方法论等在内的一整套新的分布式软件系统构造方法和环境, 涵盖服务的整个生命周期.而在 SOA 的架构风格中,服务是最核心的抽象手段. SOA 中的服务是构建在一些列基于开放标准的基础之上的, Web 服务定义了如何在异构系统之间实现通信的标准化方法, 从而就使得

SAP WEBSERVICE Soap中RPC-style和Document-style

RPC是以方法调用的方式描写叙述WebSerivce的,也就是说,你要说清楚调用的那个方法,以及各个參数的名称和值.要描写叙述这些东东.SOAP消息就要有一个统一的规范,指出那一部分是方法名.哪个部分是參数,哪个部分是返回值. 换句话说.RPC方式调用的SOAP消息格式是有章可循的,固定的.(比方说.每一个Parameter必须相应一个Part,Part的name必须和參数名一致). 而Document则是以文档传输的方式描写叙述WebService,仅仅要你的SoapBody里面是一个能够用S

浅谈WebService SOAP、Restful、HTTP(post/get)请求

HTTP-GET 和 HTTP-POST HTTP-GET和HTTP-POST是标准协议,他们使用HTTP(超文本传输协议)谓词(谓词是指条件表达式的求值返回真或假的过程.)对参数进行编码并将参数作为名称/值对传递,还使用关联的请求语义.每个协议都包含一系列HTTP请求标头,HTTP请求标头及其他一些信息定义客户端向服务器请求哪些内容,哪个服务器用一系列HTTP响应标头和所请求的数据进行响应. HTTP-GET 使用 MIME 类型 application/x-www-form-urlencod

restful webservice SOAP webservice

为了说明这个问题,必须的纠正一下我们对HTTP的认识. 首先回顾一下OSI七层模型 OSI(Open System Interconnection,开放系统互连)七层模型 7 应用层 6 表示层 5 会话层 4 传输层 3 网络层 2 数据链路层 1 物理层 HTTP并不是一种传输层的"传输协议"(第四层),而是一种应用层的"转移协议"(最高层). SOAP类型的WebService就是最好的例子,SOAP消息完全就是将Http协议作为消息承载, 以至于对于Http