2011-04-04 61 views
3

我們創建了一個類來包裝Web服務響應的有效負載,其中包含以下常見信息。SOAP通用類型序列化

public class ItemResponse<T> : Response 
    { 
    /// <summary> 
    /// constructor to set private properties Item and Status 
    /// </summary> 
    /// <param name="item"></param> 
    /// <param name="status"></param> 
    public ItemResponse(T item, ResponseStatusEnum status) : base(status) 
    { 
     _item = item; 
    } 

    public ItemResponse() 
    { 
    } 


    public ItemResponse(ResponseStatusEnum status, System.Collections.Generic.List<ResponseError> errors) : base(status, errors) 
    { 
    } 
    private T _item; 

    public T Item 
    { 
     get 
     { 
      return _item; 
     } 
    } 


} 

基類「Response」僅包含響應的錯誤信息和狀態。 wsdl清楚地顯示了此響應的定義爲ItemResponseOfType [TypeName],但是定義中缺少項目類型信息。

我們嘗試添加

[XmlInclude(typeof(TypeName))] 

,但無濟於事。任何想法我們可以做什麼來讓SOAP序列化器知道我們想要「Item」類型序列化?

回答

1

好的,我們已經到了這個底部。

事實證明,XML序列化器可以序列化一種排序的泛型類型。正如neontapir正確指出泛型類型並不完全支持XML序列化器,但它仍然可以序列化泛型類型,因爲它會創建類型ItemResponseOfType [TheType],正如我在我的問題中提到的。

XML序列化程序只是不會將該類型序列化爲泛型類型。

我們的問題只是該屬性Item是隻讀的,結果SOAP錯過了Item屬性。我們只需要使物業公開設置爲修復如下

public class ItemResponse<T> : Response 
{ 
/// <summary> 
/// constructor to set private properties Item and Status 
/// </summary> 
/// <param name="item"></param> 
/// <param name="status"></param> 
public ItemResponse(T item, ResponseStatusEnum status) : base(status) 
{ 
    Item = item; 
} 

public ItemResponse() 
{ 
} 


public ItemResponse(ResponseStatusEnum status, System.Collections.Generic.List<ResponseError> errors) : base(status, errors) 
{ 
} 

public T Item 
{ 
    get; set; 
} 
} 
+1

你的問題不在於「SOAP」 - 它是XML序列化器工作的方式。 – 2011-04-05 20:08:56

+0

是的,我認爲這是正確的。 XML序列化程序創建「虛擬」程序集的方式意味着它需要能夠設置導致問題的實例屬性。 – Sheff 2011-04-07 08:51:41

2

SOAP串行器不支持泛型類型。 Microsoft建議使用WCF http://msdn.microsoft.com/en-us/library/ms172342(v=VS.100).aspx。在WCF之前,我記得他們推薦XML序列化器。

+0

嗯,這是一個痛苦。由此產生的WSDL似乎表明它支持它,但是來自Web服務方法的響應類型定義爲ItemResponseOfType [TypeName]其中[TypeName]是有效內容類型。它只是沒有充實類型屬性的響應。 – Sheff 2011-04-04 15:13:39

+0

圍繞2.0和泛型的引入,微軟停止了SOAP串行器的開發。 – neontapir 2011-04-04 15:16:13

+0

在沒有WCF的情況下,是否可以編寫一個自定義序列化程序,它只鏈接「Item」類型的序列化程序? – Sheff 2011-04-04 15:46:56