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);
  • 相关阅读:
    java8 日期时间之间的关系
    redis bind连不上的坑
    mysql 表结构转excel表格
    软件工程实践总结
    Beta答辩总结
    Beta 冲刺(7/7)
    Beta 冲刺(6/7)
    Beta 冲刺(5/7)
    Beta 冲刺(4/7)
    Beta 冲刺(3/7)
  • 原文地址:https://www.cnblogs.com/qtiger/p/5629806.html
Copyright © 2011-2022 走看看