Domanda

Qualcuno ha avuto questo effettivamente lavoro?La documentazione è inesistente su come abilitare questa funzione e ho mancanti attributo eccezioni, pur avendo un 3.5 SP1 progetto.

È stato utile?

Soluzione

Ho scoperto che non funziona con interni/tipi di privati, ma facendo il mio tipo di pubblico, ha funzionato bene.Questo significa che non è anonimo tipi :(

Utilizzando riflettore ho trovato il metodo ClassDataContract.IsNonAttributedTypeValidForSerialization(Tipo), che sembra prendere la decisione.È l'ultima riga che sembra essere il killer, il tipo deve essere visibile, in modo che nessun interni/tipi di privati accettati :(

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

}

Altri suggerimenti

Ho ottenuto questo per lavorare su una applicazione di test proprio bene...

Definizione Di Servizio:

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

Implementazione Del Servizio:

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

}

Ci sono diversi serializzazione opzioni in WCF:Contratto di dati, la Serializzazione XML e raw e i dati di payload.Quale di questi si sta tentando di utilizzare?La questione, sembra che si sta tentando di utilizzare qualcosa di diverso da oggetti decorati con datacontact attributi.È che quello che stai chiedendo?

Sì, sto tentando di utilizzare l'attributo libero di serializzazione che è stato annunciato come parte del SP1 (http://www.pluralsight.com/community/blogs/aaron/archive/2008/05/13/50934.aspx).Dannato se riesco a farlo funzionare e non c'è documentazione.

Forse il mio uso di classi base astratte è confusa la questione, anche se sto aggiungendo il tutto nel noto elenco di tipi.

Sì, si potrebbe avere a che fare con classi astratte e di eredità.A volte può pasticciare con la serializzazione.Inoltre, potrebbe essere la visibilità delle classi e gerarchie di classi e se tutto ciò che non è pubblico.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top