2011-02-28 49 views
5

我有兩個階級,一個Web方法如下從ASMX web方法返回派生類對象時,爲什麼我的基類字段沒有被序列化?

[Serializable] 
public class BaseClass 
{ 
    public int Key; 
    public bool IsModified; 
    public bool IsNew; 
    public bool IsDeleted; 
} 

[Serializable] 
public class DerivedClass : BaseClass 
{ 
    public string Name; 
} 

[WebMethod] 
public List<DerivedClass> GetDerivedClassObjects() 
{ 

} 

但是,當我看到SOAP響應,我沒有看到從基類中的字段。他們不應該被序列化嗎?如果我想讓它們被序列化,應該怎麼做?

+1

重複的問題?請參閱http://stackoverflow.com/questions/1262246/asmx-web-service-not-serializing-abstract-base-class – KBoek 2011-02-28 19:35:42

+0

你在GetDerivedClassObjects()中返回什麼?它應該很好,沒有任何特別的做法。 – 2011-02-28 19:43:07

+0

和所有:'[Serializable]'被XmlSerializer忽略。 – 2011-02-28 20:20:19

回答

3

你可以從你的類中刪除[Serializable]屬性,這應該沒有工作。 POCO不要求該屬性存在,它們按照原樣序列化。

編輯:您是否真的檢查過Web服務輸出是什麼,或者您是否正在查看服務Web端點上的消息定義?

我可以看到,當您瀏覽到您的瀏覽器服務端點生成的SOAP消息格式似乎不知道基類領域的任何東西:

<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soap:Body> 
    <GetDerivedClassObjectsResponse xmlns="http://tempuri.org/"> 
     <GetDerivedClassObjectsResult> 
     <DerivedClass> 
      <Name>string</Name> 
     </DerivedClass> 
     <DerivedClass> 
      <Name>string</Name> 
     </DerivedClass> 
     </GetDerivedClassObjectsResult> 
    </GetDerivedClassObjectsResponse> 
    </soap:Body> 
</soap:Envelope> 

但是,當你調用Web服務使用測試的形式,或Storm,類被序列化:

<DerivedClass> 
    <Key>1</Key> 
    <IsModified>true</IsModified> 
    <IsNew>true</IsNew> 
    <IsDeleted>true</IsDeleted> 
    <Name>Test1</Name> 
</DerivedClass> 

Visual Studio的「添加Web引用」對話框還正確地創建代理類。

編輯2:縱觀Web服務定義(?service.asmx WSDL)對我們產生的,我們可以看到,該定義保留了原始的繼承層次,而不是壓扁對象到其在田野序列化過程:

<s:complexType name="DerivedClass"> 
    <s:complexContent mixed="false"> 
     <s:extension base="tns:BaseClass"> 
      <s:sequence> 
       <s:element minOccurs="0" maxOccurs="1" name="Name" type="s:string" /> 
      </s:sequence> 
     </s:extension> 
    </s:complexContent> 
</s:complexType> 
<s:complexType name="BaseClass"> 
    <s:sequence> 
     <s:element minOccurs="1" maxOccurs="1" name="Key" type="s:int" /> 
     <s:element minOccurs="1" maxOccurs="1" name="IsModified" type="s:boolean" /> 
     <s:element minOccurs="1" maxOccurs="1" name="IsNew" type="s:boolean" /> 
     <s:element minOccurs="1" maxOccurs="1" name="IsDeleted" type="s:boolean" /> 
    </s:sequence> 
</s:complexType> 

有趣的是,似乎在服務端點生成的示例消息沒有考慮到擴展。但對於所有其他影響和目的,您的代碼應該工作。

+0

是的你是對的。當我創建代理類時,我可以看到我的基類中的所有字段。我也有Web方法的屬性[XmlInclude(typeof(BaseClass)]。 – logik6 2011-03-02 12:48:17

1

您必須將KnownType屬性添加到基類。

[Serializable] 
[KnownType(typeof(DerivedClass)] 
public class BaseClass 
{ 
    ... 
} 
+0

-1:他正在使用ASMX服務。 'KnownType'用於WCF。 – 2011-02-28 20:19:08

+0

恐怕不適合我。但我今天確實學到了一些東西。我做了更改,但仍未顯示SOAP中的字段。僅供參考,我正在使用.Net 3.5 – logik6 2011-02-28 20:21:49

相關問題