你可以從你的類中刪除[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>
有趣的是,似乎在服務端點生成的示例消息沒有考慮到擴展。但對於所有其他影響和目的,您的代碼應該工作。
重複的問題?請參閱http://stackoverflow.com/questions/1262246/asmx-web-service-not-serializing-abstract-base-class – KBoek 2011-02-28 19:35:42
你在GetDerivedClassObjects()中返回什麼?它應該很好,沒有任何特別的做法。 – 2011-02-28 19:43:07
和所有:'[Serializable]'被XmlSerializer忽略。 – 2011-02-28 20:20:19