2010-11-10 8 views
12

Ich habe eine gemeinsame Bibliothek mit einigen Objekten darin. Dann habe ich ein Dienstprojekt, das auf die allgemeine Bibliothek verweist und einige abgeleitete Typen aus Objekten in der allgemeinen Bibliothek erstellt.Serialisieren eines abgeleiteten Typs als Basistyp mit WCF

Ich möchte, dass mein Dienst die abgeleiteten Typen als ihre in der allgemeinen Bibliothek definierten Basistypen serialisiert.

Ich kann KnownTypes für die Objekte in der allgemeinen Bibliothek nicht verwenden, da ich nicht möchte, dass die allgemeine Bibliothek auf die Service Assemblies verweist.

Also, wie kann ich die abgeleiteten Typen als ihre Basistypen serialisieren?

Ich wünschte, ich könnte etwas tun, wie ...

[Datacontract (SerializeAsType = typeof (Basetype))] public class DerivedType: Basetype { }

Ist so etwas möglich?

Antwort

3

Verwenden Sie .NET 4.0? Sie können die DataContractResolver dafür verwenden, wenn Sie sind:

http://msdn.microsoft.com/en-us/library/system.runtime.serialization.datacontractresolver.aspx

Dies auch im Grunde ist das, was Entity Framework 4.0 hat für seine DataContractResolver für Proxy-Typen. Hier

ein Beispiel: http://blogs.msdn.com/b/youssefm/archive/2009/06/05/introducing-a-new-datacontractserializer-feature-the-datacontractresolver.aspx

(siehe DeserializeAsBaseResolver im Link).

EDIT: Wenn Sie nicht mit .NET 4.0, denke ich, Ihre nächste beste Option ist ein DataContractSurrogate: http://msdn.microsoft.com/en-us/library/system.runtime.serialization.idatacontractsurrogate.aspx. ... so können Sie die Serialisierung von Hand steuern, aber dies kann unordentlich werden.

Beide werden in den Konstruktor Ihres DataContractSerializers übergeben und können für WCF über das DataContractSerializerOperationBehavior konfiguriert werden:.

+0

Ich verwende 3,5, also musste ich mit der Ersatzoption gehen ... Und es hat super geklappt! Danke – Dannerbo

6

Wir haben dieses Problem gerade gelöst, indem wir die vererbte Klasse [DataContract (Name = "BaseClass")] gesetzt haben. Es funktioniert auch, wenn die geerbte Klasse intern und in einem anderen Projekt definiert ist.

Ich hoffe, es hilft.

+0

Hallo Marc. War das alles, was du getan hast? Können wir ein vollständigeres Beispiel haben? – Xiaofu

+0

Ja, das war alles was getan werden musste. Benennen Sie den Vertrag einfach in den Namen der Basisklasse um. – marc

+0

+1 Für mich war das bei weitem die einfachste Lösung. Es ist ein One-Liner, der funktioniert. Der Ansatz von DataContractResolver ist lang und umfasst Klassen und das Einfügen des Resolver-Serverhosts usw. Seine einzige einlösende Funktion ist, dass Sie das Verhalten auf einer Vertragsmethode nach Methoden steuern können - wobei diese Name = -Lösung für alle Instanzen des Transports dieses Objekts gilt (in meinem Fall war das in Ordnung). – Ricibob

Verwandte Themen