2010. április 21., szerda

WCF és a polimorfizmus

A WCF a DataContract szerializáláskor/deszerializáláskor alapból nem képes kezelni a polimorfizmust. Azaz, nem definiálhatunk adattagként egy ősosztály-típusú elemet, aminek aztán abból származtatott típusú objektumot adunk értékül. Elhasal a származtatott osztályban bejövő új adattagok szerializációjánál.

Ilyen esetben a következő kivételt kapjuk:
System.ServiceModel.CommunicationException: The underlying connection was closed: The connection was closed unexpectedly. --- System.Net.WebException: The underlying connection was closed: The connection was closed unexpectedly..

A megoldás a [KnownType(type)] attribútum használata. Ezt az ősosztálynál kell definiálni és meg kell adni a használandó gyerekosztály típusát. Ekkor már a WCF képes szerializálni az adattagot.

Példák, és cikk a témáról:
http://geekswithblogs.net/claeyskurt/archive/2007/11/02/PolymorphismWCFdatacontracts.aspx

1 megjegyzés:

  1. Hasonlóképpen már én is szívtam, én használtam már a KnownType attribútumot, de Enum-ok kezelésére (hogy a kliensen generált proxy-ban legenerálja-e az enumot, vagy a bereferált domain model-ben levő-t kelljen átadni). Kevés olyan csillagállás van amikor jól működik :) És ugyebár az sem mindegy hogy az svcutil-al hogyan generálod a proxy-t, mert azt is fel lehet 100félképpen paraméterezni.

    VálaszTörlés