java webservice序列化_Webservice SOAP传输序列化总结

一.所有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也是不能序列化的,遇到这种情况可以把接口修改为抽象类,同时在抽象类上添加[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序列化不便的话,可考虑用二进制序列化。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值