2010-11-10 10 views
12

Tengo una biblioteca común con algunos objetos en ella. Luego tengo un proyecto de servicio que hace referencia a la biblioteca común y crea algunos tipos derivados de objetos en la biblioteca común.Cómo serializar un tipo derivado como su tipo base con WCF

Deseo que mi servicio serialice los tipos derivados como sus tipos base definidos en la biblioteca común.

No puedo usar KnownTypes en los objetos de la biblioteca común porque no quiero que la biblioteca común haga referencia a los ensamblajes de servicio.

Entonces, ¿cómo puedo hacer que wcf serialice los tipos derivados como sus tipos base?

Me gustaría poder hacer algo como ...

[DataContract (SerializeAsType = typeof (BaseType))] DerivedType clase pública: BaseType {}

es algo como esto posible?

Respuesta

3

¿Está utilizando .NET 4.0? Usted puede utilizar el DataContractResolver para esto si usted es:

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

Esto también es básicamente lo que Entity Framework 4.0 lo hace por su DataContractResolver para este tipo de proxy.

Aquí es un ejemplo: http://blogs.msdn.com/b/youssefm/archive/2009/06/05/introducing-a-new-datacontractserializer-feature-the-datacontractresolver.aspx

(ver DeserializeAsBaseResolver en el enlace).

EDIT: Si no está utilizando .NET 4.0, creo que su siguiente mejor opción es un DataContractSurrogate: http://msdn.microsoft.com/en-us/library/system.runtime.serialization.idatacontractsurrogate.aspx. ... para que pueda controlar la serialización a mano, pero esto puede ser complicado.

Ambos se pasan al constructor de su DataContractSerializer y pueden configurarse para WCF a través de DataContractSerializerOperationBehavior: http://msdn.microsoft.com/en-us/library/system.servicemodel.description.datacontractserializeroperationbehavior.aspx.

+0

Estoy usando 3.5, así que tuve que ir con la opción sustituta ... ¡Y funcionó muy bien! Gracias – Dannerbo

6

Acabamos de "resolver" este problema configurando la clase heredada [DataContract (Name = "BaseClass")]. Funciona incluso si la clase heredada es interna y está definida en otro proyecto.

Espero que ayude.

+0

Hola marc. ¿Esto fue todo lo que hiciste? ¿Podemos tener un ejemplo más completo? – Xiaofu

+0

Sí, esto era todo lo que se necesitaba hacer. Simplemente cambie el nombre del contrato por el nombre de la clase base. – marc

+0

+1 Para mí, esta fue de lejos la solución más fácil. Es un trazador de líneas que funciona. El enfoque de DataContractResolver es largo e implica clases e insertando el servidor del servidor de resolución, etc. Su única característica de canje es que puede controlar el comportamiento por método de contrato por método, donde esta solución Name = se aplica a todas las instancias de transporte de este objeto (en mi caso eso estuvo bien). – Ricibob

Cuestiones relacionadas