Webservice SOAP傳輸序列化總結 以及webservice之序列化以及反序列化實例

1、全部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對象和自定義對象. 


2、webservice傳輸過程當中常遇到的問題web

  (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]屬      性,最後須要注意一點,本身寫的類要想序列化必須有默認構造函數(不帶參數的構造函數)。

    3、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序列化不便的                    話,可考慮用二進制序列化。 數組

  4、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,序列化代碼以下:    this

      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中反序列化,代碼示例以下:    spa

      //entity是客戶端傳過來的序列化的參數      Entity.VAERP.Product product_entity = new Entity.VAERP.Product();      product_entity = ToObj<Entity.VAERP.Product>(entity);
相關文章
相關標籤/搜索