zoukankan      html  css  js  c++  java
  • Webservice SOAP传输序列化总结

    一、websocket传输对象

    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、问题一

    (1)问题描述

    调用WebService的方法,传递DataRow参数,运行时抛出异常:

     "没法将参数序列化!"

    (2)原因

    XML WebService只能对数据集DataSet对象类型进行XML序列化,不能对DataRow对象类型进行XML序列化。

    (3)解决方法

    把DataRow加入到DataSet中,并将DataSet作为参数传递再运行就OK了

    2、问题二

    Webservice服务不能完成直接序列化传输,但是大部分数据结构借助序列化,仍然可以在Webservice上传输。

    (1)问题描述  

    在将一个自定义类序列化到文件时,出现如下错误提示:     

    System.Reflection.TargetInvocationException: 调用的目标发生了异常。 ---> 
         System.InvalidOperationException: 生成 XML 文档时出错。 ---> System.InvalidOperationException:
         不应是类型 Alink.T1System.Windows.PrintSetting。使用 XmlInclude 或 SoapInclude 属性静态指定非已知的类型。 

    (2)原因

    经查找资料发现当被序例化的类中包含了自定义的复杂类

    (3)解决方法

    需要使用XmlIncludeAttribut属性标识自定义类,比如:      

    [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序列化答疑 

    • 需序列化的字段必须是公共的(public)  
    • 需要序列化的类都必须有一个无参的构造函数
    • 枚举变量可序列化为字符串,无需用[XmlInclude]
    • 导出非基本类型对象,都必须用[XmlInclude]事先声明。该规则递归作用到子元素,如导出ArrayList对象,若其成员是自定义的,需预包含处理:
    using System.Xml.Serialization; 
    [XmlInclude(typeof(自定义类))]   
    • Attribute中的IsNullable参数若等于false,表示若元素为null则不显示该元素。也就是说:针对值类型(如结构体)该功能是实效的。若数组包含了100个空间,填充了10个类对象,则序列化后只显示10个节点;若数组包含了100个空间,填充了10个结构体对象,则序列化后会显示100个节点
    • 真正无法XML序列化的情况,某些类就是无法XML序列化的(即使使用了[XmlInclude]) 
      • IDictionary(如HashTable)
      • System.Drawing.Color
      • System.Drawing.Font              
      • SecurityAttribute声明               
      • 父类对象赋予子类对象值的情况
      • 对象间循环引用  
    • 对于无法XML序列化的对象,可考虑使用自定义xml序列化(实现IXmlSerializable接口)实现IDictionary的类,比如:
      • 用其它集合类替代;
      • 用类封装之,并提供Add和this函数   
      • 某些类型需要先经过转换,然后才能序列化为 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);
  • 相关阅读:
    1082 射击比赛 (20 分)
    1091 N-自守数 (15 分)
    1064 朋友数 (20 分)
    1031 查验身份证 (15 分)
    1028 人口普查 (20 分)
    1059 C语言竞赛 (20 分)
    1083 是否存在相等的差 (20 分)
    1077 互评成绩计算 (20 分)
    792. 高精度减法
    791. 高精度加法
  • 原文地址:https://www.cnblogs.com/qtiger/p/5629806.html
Copyright © 2011-2022 走看看