WCF: Error al intentar serializar el parámetro cuando se envía una subclase

publicado por: Anonymous

Buenas, estoy trabajando sobre una solución que emplea System.Runtime.Serialization para la definición de DataContracts en las entidades que se utilizan para la comunicación del cliente con el servidor.

Cuando intenté utilizar una ClaseGral para que se puedan enviar diferentes entidades en una sola función, me dio el siguiente error (en el ejemplo, invocando miFuncion con un parámetro del tipo Subclase):

Error al intentar serializar el parámetro http://tempuri.org/:param. El mensaje de InnerException fue ‘No se espera el tipo ‘Entidades.Subclase’ con el nombre de contrato de datos ‘Subclase:http://schemas.datacontract.org/2004/07/Entidades‘. Si está usando DataContractSerializer, intente usar DataContractResolver o agregar tipos no conocidos estáticamente a la lista de tipos conocidos (por ejemplo, usando el atributo KnownTypeAttribute o agregándolos a la lista de tipos conocidos que se pasa a DataContractSerializer).’. Consulte InnerException para obtener más información.

El código que usé es el siguiente:

using System.Runtime.Serialization;
namespace Entidades
{
    [Serializable]
    [DataContract]
    public class MiEntidad
    {
        //datos
        public static void miFuncion(ClaseGral param){
            //código
        }
    }

    [DataContract]
    public abstract class ClaseGral
    {
        //datos
    }

    [DataContract]
    public class Subclase : ClaseGral
    {
        //datos
    }
}

¿Qué necesitaría modificar en mis clases para que funcione bien? No tengo claro a qué DataContractSerializer se refiere el error o dónde configurarlo.

solución

el atributo KnownTypeAttribute se especifica en las clases base para indicar al serializador DataContractSerializer (el de por defecto de WCF), qué subtipos de esa clase debe reconocer. Tu problema se puede resolver aplicando el siguiente código en tu clase [KnownType(typeof(Subclase)]

using System.Runtime.Serialization;
namespace Entidades
{
    [Serializable]
    [DataContract]
    public class MiEntidad
    {
        //datos
        public static void miFuncion(ClaseGral param){
            //código
        }
    }

    [DataContract]
    [KnownType(typeof(Subclase)]
    public abstract class ClaseGral
    {
        //datos
    }

    [DataContract]
    public class Subclase : ClaseGral
    {
        //datos
    }
}
Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *