serializar serializacion deserializar deserializacion serialization wcf datacontractserializer datacontract

serialization - deserializar - serializacion y deserializacion c#



Cómo serializar un tipo derivado como su tipo base con WCF (2)

¿Estás usando .NET 4.0? Puede usar 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 hace Entity Framework 4.0 para su DataContractResolver para los tipos de proxy.

Aquí hay 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).

EDITAR: 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 .

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.

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

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

Entonces, ¿cómo puedo tener wcf serializar los tipos derivados como sus tipos base?

Desearía poder hacer algo como ...

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

¿Es posible algo como esto?


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

Espero eso ayude.