Pergunta

Alguém conseguiu que isso realmente funcionasse?Não existe documentação sobre como ativar esse recurso e recebo exceções de atributos ausentes, apesar de ter um projeto 3.5 SP1.

Foi útil?

Solução

Descobri que não funciona com tipos internos/privados, mas tornar meu tipo público funcionou bem.Isso significa que também não há tipos anônimos :(

Usando o refletor encontrei o método ClassDataContract.IsNonAttributedTypeValidForSerialization(Type) que parece tomar a decisão.É a última linha que parece ser a assassina, o tipo deve estar visível, portanto, nenhum tipo interno/privado é permitido :(

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));

}

Outras dicas

Consegui que isso funcionasse perfeitamente em um aplicativo de teste ...

Definição de serviço:

[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; }
    }
}

Implementação de serviço:

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

}

Existem várias opções de serialização no WCF:Contrato de dados, serialização XML e carga útil de dados brutos.Qual destes você está tentando usar?Pela pergunta, parece que você está tentando usar algo diferente de objetos decorados com atributos datacontact.É isso que você está perguntando?

Sim, estou tentando usar o atributo serialização gratuita que foi anunciado como parte do SP1 (http://www.pluralsight.com/community/blogs/aaron/archive/2008/05/13/50934.aspx).Dane-se se consigo fazê-lo funcionar e não há documentação para isso.

Possivelmente meu uso de classes base abstratas está confundindo o assunto, embora eu esteja adicionando tudo à lista de tipos conhecidos.

Sim, poderia ter a ver com classes abstratas e herança.Às vezes, pode atrapalhar a serialização.Além disso, pode haver visibilidade das classes e da hierarquia de classes se tudo não for público.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top