2011-02-28 14 views
5

İki sınıfım var ve şu şekilde bir web yöntemi var:ASMX web yönteminden türetilmiş sınıf nesnesini döndürürken neden temel sınıf alanım serileştirilmiyor?

[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() 
{ 

} 

Ancak SOAP yanıtını gördüğümde, temel sınıftaki alanları göremiyorum. Serileştirilmeleri gerekmez mi? Seri hale getirilmelerini istediysem ne yapılmalı?

+1

yinelenen soru? http://stackoverflow.com/questions/1262246/asmx-web-service-not-serializing-abstract-base-class – KBoek

+0

sayfasına bakın. GetDerivedClassObjects() 'de ne işe yararsınız? . –

+0

ve tümü: '[Serializable]' XmlSerializer tarafından yok sayılır. –

cevap

3

Eğer sınıflardan [Serializable] özelliklerini kaldırabilir, bu olmadan çalışması gerekir. POCO'lar özniteliğin mevcut olmasını gerektirmez, onlar oldukları gibi serileştirir.

Edit: Web hizmeti çıktısının ne olduğunu kontrol ettiniz mi, yoksa yalnızca servis web uç noktasındaki mesaj tanımına bakıyor musunuz?

Ben tarayıcınızda hizmet bitiş noktasına göz oluşturulan SABUN ileti biçimi taban sınıfı alanları hakkında hiçbir şey bilmek görünmüyor görebilirsiniz: Web hizmetini aradığınızda

<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> 

Ama Storm test formu kullanarak veya sınıf tefrika olur:

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

visual studio "web referansı ekle" iletişim de doğru vekil sınıfları oluşturur.

Düzenleme 2: web hizmeti tanımına baktığımızda (? Service.asmx wsdl) bizim için üretilen, biz kendi alanlarına aşağı nesneyi düzleştirme aksine tanımı, orijinal miras hiyerarşisini koruyan görebilirsiniz serileştirme işlemi:

<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> 

İlginçtir ki hizmet son ucunda oluşturulan numune mesajı dikkate uzantısı almaz görünüyor. Ancak diğer tüm efektler ve amaçlar için kodunuz çalışmalıdır.

+0

Evet haklısın. Vekil sınıfını oluşturduğumda, tüm alanları temel sınıfımdan görebiliyordum. Web yöntemi için [XmlInclude (typeof (BaseClass)] özelliğine de sahip oldum. – logik6

1

Taban sınıfına KnownType özniteliğini eklemelisiniz.

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

-1: Bir ASMX servisi kullanıyor. 'KnownType' WCF içindir. –

+0

Korkarım ki benim için çalışmadı. Ama bugün bir şey öğrendim. Değişiklikleri yaptım ama hala SOAP alanındaki alanları göstermiyor. FYI, kullanıyorum. Net 3.5 – logik6

İlgili konular