一、所有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传输过程中常遇到的问题

  (1)在调用WebService并给一个方法传递了一个DataRow参数时,运行时会抛出异常: "没法将参数序列化!",如果把DataRow加入到DataSet中,并将DataSet作为参数          传递再运行就OK了。 这是因为:XML WebService只能对数据集DataSet对象类型进行XML序列化,不能对DataRow对象类型进行XML序列化造成的错误.因此了解一下               XML WebService支持序列化的基本数据类型是比较重要的.
  (2)除了上述的基本类型以外,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函数

   (8)某些类型需要先经过转换,然后才能序列化为 XML。如XML序列化System.Drawing.Color,可先用ToArgb()将其转换为整数,过于复杂的对象用xml序列化不便的                    话,可考虑用二进制序列化。

  四、webservice序列化和反序列化实例

    //序列化为xml的方法    

    public static string ToXml(this object obj)
        {
            XmlSerializer serializer = new XmlSerializer(obj.GetType());
            StringWriter sw = new StringWriter();
                serializer.Serialize(sw, obj);
            return sw.ToString();
        }

    //反序列化为XML的方法

    public static T ToObj<T>(string xml) //where T : Object
{
XmlSerializer serializer = new XmlSerializer(typeof(T));
StringReader sw = new StringReader(xml);
object obj = serializer.Deserialize(sw);
if (obj is T)
{
return (T)obj;
}
else
{
return default(T);
}
}

    //客户端调用webservice中的InsertData(string entity)方法,传递的是的类实体product_entity,序列化代码如下:    

      pm.WebProductService ps = new pm.WebProductService(); 
      Entity.VAERP.Product product_entity = new Entity.VAERP.Product();
      string entity = product_entity.ToXml();
string result = ps.InsertData(entity);

    //服务端webservice中反序列化,代码示例如下:    

      //entity是客户端传过来的序列化的参数
      Entity.VAERP.Product product_entity = new Entity.VAERP.Product();
      product_entity = ToObj<Entity.VAERP.Product>(entity);

Webservice SOAP传输序列化总结 以及webservice之序列化以及反序列化实例的更多相关文章

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

    http://www.itnose.net/detail/6189456.html 浅谈WebService SOAP.Restful.HTTP(post/get)请求 2015-01-09 19:2 ...

  2. RobotFrameWork webservice soap接口测试 (二)

    上一篇提到做soap接口测试自己简单的写了个py,然后就简单的实现了个客户端能对远程接口进行调用,对返回的数据进行解析,可后面想着也觉得不对劲,soap协议虽说不像http协议那么普及,但是现在很多公 ...

  3. [Java] webservice soap,wsdl 例子

    java 调用webservice的各种方法总结 现在webservice加xml技术已经逐渐成熟,但要真正要用起来还需时日!! 由于毕业设计缘故,我看了很多关于webservice方面的知识,今天和 ...

  4. webService(SOAP)性能测试脚本

    本文以天气预报的webService为基础进行学习   webService地址:http://www.webxml.com.cn/WebServices/WeatherWebService.asmx ...

  5. webService —— soap

    package soupTest; import javax.jws.WebMethod; import javax.jws.WebService; import javax.xml.ws.Endpo ...

  6. So easy Webservice 3.使用HttpClient工具调用Webservice接口

    首先,看看webservice服务调用演示: a) 登录http://www.webxml.com.cn b) 单击手机查询服务 c) 选择要调用的方法 例如: getMobileCodeInfo 输 ...

  7. [置顶] WebService学习总结(1)——WebService相关概念

    一.序言 大家或多或少都听过 WebService(Web服务),有一段时间很多计算机期刊.书籍和网站都大肆的提及和宣传WebService技术,其中不乏很多吹嘘和做广告的成 分.但是不得不承认的是W ...

  8. 真正的轻量级WebService框架——使用JAX-WS(JWS)发布WebService

    WebService历来都很受重视,特别是Java阵营,WebService框架和技术层出不穷.知名的XFile(新的如CXF).Axis1.Axis2等. 而Sun公司也不甘落后,从早期的JAX-R ...

  9. Python的Web编程[2] -> WebService技术[0] -> 利用 Python 调用 WebService 接口

    WebService技术 / WebService Technology 1 关于webservice / Constants WebService是一种跨编程语言和跨操作系统平台的远程调用技术. W ...

随机推荐

  1. 有向无环图(DAG)的最小路径覆盖(转)

    DAG的最小路径覆盖 定义:在一个有向图中,找出最少的路径,使得这些路径经过了所有的点. 最小路径覆盖分为最小不相交路径覆盖和最小可相交路径覆盖. 最小不相交路径覆盖:每一条路径经过的顶点各不相同.如 ...

  2. java类的高级特性

    1.非内部类不能被声明为private 或protected访问类型.

  3. Socket网络编程例子

    1.为了安全的进行通信,基于ACK确认机制----重传机制 使用selector机制的多路复用的IO通信机制,此外还有epoll控制 业务挂接点或者接入点: 常见的接入点: RDBMS进行CRUD M ...

  4. ASP.Net软件工程师基础(三)

    1.多态 答: (1)虚方法 public class Child : Person { public void Speach() { base.Speach(); } public virtual ...

  5. 配置Git Extension免密码发布代码到CSDN

    配置Git Extension免密码发布代码到CSDN [本文默认大家安装了Git以及Git Extension] 今天花费了许多的时间处理这个问题,希望能给大家节约时间.闲话少说:使用ssh验证来p ...

  6. 《Code Complete》ch.21 协同构建

    WHAT? 所有的协同构建技术都试图通过这样那样的途径,将展示工作的过程正式化,以便将错误暴露出来 WHY? 提高缺陷检出率,从而缩短开发周期,降低开发成本 发现不明显的错误信息,如不恰当的注释.硬编 ...

  7. flex的Cairngorm框架

    由于要写flex的项目,接触了一段时间的Cairngorm框架,初步认识它是flex的一个mvc结构的框架实现了页面,调用相应方法的控制,和后台交互之间的三层之间的联系.Cairngorm框架主要包括 ...

  8. 从100PV到1亿级PV网站架构演变

    如果你对项目管理.系统架构有兴趣,请加微信订阅号"softjg",加入这个PM.架构师的大家庭 一个网站就像一个人,存在一个从小到大的过程.养一个网站和养一个人一样,不同时期需要不 ...

  9. 如何用手机维护Mysql数据库

    如何用手机维护网站数据库 身边很多人都在拿ipad或iphone来玩儿游戏或听歌,大多数人认为它们就是个娱乐设备,在我看来它们同样可以帮助我们更加快捷的工作,我用手机遥控单反.用手机控制PPT的播放. ...

  10. MFC ComboBox的使用

    前言 Combo Box (组合框)控件很简单,可以节省空间.从用户角度来看,这个控件是由一个文本输入控件和一个下拉菜单组成的.用户可以从一个预先定义的列表里选择一个选项,同时也可以直接在文本框里面输 ...