Pregunta

¿Alguien ha conseguido que esto realmente funcione?No existe documentación sobre cómo habilitar esta función y me faltan excepciones de atributos a pesar de tener un proyecto 3.5 SP1.

¿Fue útil?

Solución

Descubrí que no funciona con tipos internos/privados, pero al hacer mi tipo público funcionó bien.Esto tampoco significa que haya tipos anónimos :(

Usando reflector encontré el método ClassDataContract.IsNonAttributedTypeValidForSerialization(Type) que parece tomar la decisión.Es la última línea la que parece ser la asesina, el tipo debe ser visible, por lo que no se permiten tipos internos/privados :(

internal static bool IsNonAttributedTypeValidForSerialization(Type type)
{
    if (type.IsArray)
    {
         return false;
    }
    if (type.IsEnum)
    {
        return false;
    }
    if (type.IsGenericParameter)
    {
        return false;
    }
    if (Globals.TypeOfIXmlSerializable.IsAssignableFrom(type))
    {
        return false;
    }
    if (type.IsPointer)
    {
        return false;
    }
    if (type.IsDefined(Globals.TypeOfCollectionDataContractAttribute, false))
    {
        return false;
    }
    foreach (Type type2 in type.GetInterfaces())
    {
        if (CollectionDataContract.IsCollectionInterface(type2))
        {
            return false;
        }
    }
    if (type.IsSerializable)
    {
        return false;
    }
    if (Globals.TypeOfISerializable.IsAssignableFrom(type))
    {
        return false;
    }
    if (type.IsDefined(Globals.TypeOfDataContractAttribute, false))
    {
        return false;
    }
    if (type == Globals.TypeOfExtensionDataObject)
    {
        return false;
    }
    if (type.IsValueType)
    {
        return type.IsVisible;
    }
    return (type.IsVisible && (type.GetConstructor(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance, null, Globals.EmptyTypeArray, null) != null));

}

Otros consejos

Conseguí que esto funcionara bien en una aplicación de prueba...

Definición de servicio:

[ServiceContract]
public interface IService1
{

    [OperationContract]
    CompositeType GetData(int value);

}


public class CompositeType
{
    bool boolValue = true;
    string stringValue = "Hello ";

    public bool BoolValue
    {
        get { return boolValue; }
        set { boolValue = value; }
    }

    public string StringValue
    {
        get { return stringValue; }
        set { stringValue = value; }
    }
}

Implementación del servicio:

public class Service1 : IService1
{
    public CompositeType GetData(int value)
    {
        return new CompositeType()
        {
            BoolValue = true,
            StringValue = value.ToString()
        };
    }

}

Hay varias opciones de serialización en WCF:Contrato de datos, serialización XML y carga útil de datos sin procesar.¿Cuál de estos estás intentando utilizar?Según la pregunta, parece que estás intentando utilizar algo más que objetos decorados con atributos de contacto de datos.¿Es eso lo que preguntas?

Sí, estoy intentando utilizar el atributo de serialización gratuita que se anunció como parte del SP1 (http://www.pluralsight.com/community/blogs/aaron/archive/2008/05/13/50934.aspx).Maldita sea si puedo hacerlo funcionar y no hay documentación para ello.

Posiblemente mi uso de clases base abstractas esté confundiendo el asunto, aunque estoy agregando todo a la lista de tipos conocidos.

Sí, podría tener que ver con clases abstractas y herencia.A veces puede afectar la serialización.Además, también podría haber visibilidad de las clases y la jerarquía de clases si todo no es público.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top