Webservice SOAP傳輸序列化總結

2021-08-27 06:13:04 字數 2664 閱讀 7694

一.所有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序列化不便的話,可考慮用二進位制序列化。

答疑引自

iOS呼叫WebService(SOAP介面)

首先有幾點說在前面 使用常見的afnetworking 進行請求,請求分為兩個部分,url和parameter,url就是後台給你的介面,這個parameter需要填寫入乙個完整的帶有引數的soap字串。soap字串格式如下 1.命名空間在根目錄上 xmlns xsi xmlns xsd xmlns...

Webservice SOAP傳輸序列化總結

一.所有webservice中傳遞的物件都必須能夠序列化,這個是作為在網路之間傳輸的必要條件。xml webservice和soap標準支援的資料型別如下 1.基本資料型別.標準型別,如 int float bool datetime string等基本資料型別 2.列舉.支援列舉enum定義的型別...

傳值 傳引用 傳指標

收藏 相關概念 c 三種傳遞引數方式 傳引數的值 稱值傳遞,簡稱傳值 傳引數的位址 稱位址傳遞,簡稱為傳址 和引用傳遞 稱為傳引用 相應的函式傳值呼叫,傳址呼叫和傳引用呼叫 形參 實參 函式定義時參數列中的引數稱為形式引數,簡稱形參 函式呼叫時參數列中的引數稱為實際引數,簡稱實參。實參和形參之間的資...