2010-11-10 3 views
12

Ho una libreria comune con alcuni oggetti al suo interno. Quindi ho un progetto di servizio che fa riferimento alla libreria comune e crea alcuni tipi derivati ​​dagli oggetti nella libreria comune.Come serializzare un tipo derivato come tipo di base con WCF

Desidero che il mio servizio serializzi i tipi derivati ​​come tipi di base definiti nella libreria comune.

Non posso utilizzare KnownTypes sugli oggetti nella libreria comune perché non desidero la libreria comune che fa riferimento agli assembly di servizio.

Quindi, come posso avere wcf serializzare i tipi derivati ​​come tipi di base?

Vorrei poter fare qualcosa di simile ...

[DataContract (SerializeAsType = typeof (BaseType))] public class DerivedType: BaseType {}

è qualche cosa come questo possibile?

risposta

3

Si sta utilizzando .NET 4.0? È possibile utilizzare il DataContractResolver per questo se siete:

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

Questo è anche fondamentalmente ciò che Entity Framework 4.0 fa per la sua DataContractResolver per i tipi di proxy.

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

(vedi DeserializeAsBaseResolver nel link).

MODIFICA: Se non si utilizza .NET 4.0, penso che la tua prossima opzione migliore sia DataContractSurrogate: http://msdn.microsoft.com/en-us/library/system.runtime.serialization.idatacontractsurrogate.aspx. ... così puoi controllare la serializzazione a mano, ma questo può diventare complicato.

Entrambe sono passate nel costruttore di DataContractSerializer e possono essere configurate per WCF tramite DataContractSerializerOperationBehavior: http://msdn.microsoft.com/en-us/library/system.servicemodel.description.datacontractserializeroperationbehavior.aspx.

+0

Sto usando 3.5, quindi ho dovuto scegliere l'opzione surrogata ... E ha funzionato benissimo! Grazie – Dannerbo

6

Abbiamo appena "risolto" questo problema impostando la classe ereditata [DataContract (Name = "BaseClass")]. Funziona anche se la classe ereditata è interna e definita in un altro progetto.

Spero che aiuti.

+0

Ciao marc. Questo è tutto ciò che hai fatto? Possiamo avere un esempio più completo? – Xiaofu

+0

Sì, questo era tutto ciò che era necessario fare. Basta rinominare il contratto con il nome della classe base. – marc

+0

+1 Per me questa è stata di gran lunga la soluzione più semplice. È un solo rivestimento che funziona. L'approccio DataContractResolver è lungo e comprende classi e l'inserimento dell'host del server resolver ecc. La sua unica funzione di riscatto è che è possibile controllare il comportamento su un metodo di contratto in base al metodo - dove Nome = soluzione si applica a tutte le istanze di trasporto di questo oggetto (nel mio caso era ok). – Ricibob