Question

Quelqu'un at-il ce que cela fonctionne réellement? La documentation sur l'activation de cette fonctionnalité est inexistante et les exceptions d'attribut manquantes me manquent malgré le projet 3.5 SP1.

Était-ce utile?

La solution

J'ai constaté que cela ne fonctionnait pas avec les types internes / privés, mais rendre mon type public était efficace. Cela signifie qu'il n'y a pas non plus de types anonymes: (

En utilisant un réflecteur, j'ai trouvé la méthode ClassDataContract.IsNonAttributedTypeValidForSerialization (Type) qui semble prendre la décision. C'est la dernière ligne qui semble être le tueur, le type doit être visible, donc aucun type interne / privé n'est autorisé: (

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

}

Autres conseils

J'ai réussi à faire fonctionner cela sur une application de test ...

Définition du service:

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

Implémentation du service:

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

}

Il existe plusieurs options de sérialisation dans WCF: contrat de données, sérialisation XML et charge utile de données brutes. Lequel de ces essayez-vous d'utiliser? De la question, il semble que vous essayez d'utiliser autre chose que des objets décorés avec des attributs de contact de données. Est-ce ce que vous demandez?

Oui, j'essaie d'utiliser la sérialisation sans attribut annoncée dans le cadre du SP1 ( http://www.pluralsight.com/community/blogs/aaron/archive/2008/05/13/50934.aspx ). Damned si je peux le faire fonctionner et il n'y a aucune documentation pour cela.

Peut-être que mon utilisation des classes de base abstraites est source de confusion, bien que j'ajoute tout dans la liste des types connus.

Oui, cela pourrait avoir à voir avec les classes abstraites et l’héritage. Cela peut parfois gâcher la sérialisation. En outre, la visibilité des classes et de la hiérarchie des classes pourrait également être visible si tout n’est pas public.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top