Condividi tramite


Utilizzo di DataContractSerializer e DataContractResolver per fornire la funzionalità di NetDataContractSerializer

Questo esempio dimostra come l'utilizzo di DataContractSerializer con un DataContractResolver appropriato offra la stessa funzionalità di NetDataContractSerializer. Questo esempio mostra come creare il DataContractResolver appropriato e come aggiungerlo a DataContractSerializer.

Dettagli dell'esempio

Le classi NetDataContractSerializer e DataContractSerializer differiscono per un aspetto importante: la classe NetDataContractSerializer include informazioni di tipo CLR nell'XML serializzato, a differenza della classe DataContractSerializer. Pertanto, la classe NetDataContractSerializer può essere utilizzata solo se le estremità di serializzazione e deserializzazione condividono gli stessi tipi CLR. Si consiglia tuttavia di utilizzare la classe DataContractSerializer perché le prestazioni sono migliori rispetto alla classe NetDataContractSerializer. È possibile modificare le informazioni serializzate in DataContractSerializer aggiungendo un DataContractResolver.

L'esempio è costituito da due progetti. Il primo progetto utilizza NetDataContractSerializer per serializzare un oggetto. Il secondo progetto utilizza DataContractSerializer con un DataContractResolver per offrire la stessa funzionalità del primo progetto.

Nell'esempio di codice seguente viene mostrata l'implementazione di un DataContractResolver personalizzato, denominato MyDataContractResolver, aggiunto a DataContractSerializer nel progetto DCSwithDCR.

class MyDataContractResolver : DataContractResolver
{
    private XmlDictionary dictionary = new XmlDictionary();

    public MyDataContractResolver()
    {
    }

    // Used at deserialization
    // Allows users to map xsi:type name to any Type 
    public override Type ResolveName(string typeName, string typeNamespace, DataContractResolver knownTypeResolver)
    {
        Type type = knownTypeResolver.ResolveName(typeName, typeNamespace, null);
        if (type == null)
        {
            type = Type.GetType(typeName + ", " + typeNamespace);
        }
        return type;
    }

    // Used at serialization
    // Maps any Type to a new xsi:type representation
    public override void ResolveType(Type dataContractType, DataContractResolver knownTypeResolver, out XmlDictionaryString typeName, out XmlDictionaryString typeNamespace)
    {
        knownTypeResolver.ResolveType(dataContractType, null, out typeName, out typeNamespace);
        if (typeName == null || typeNamespace == null)
        {
            XmlDictionary dictionary = new XmlDictionary();
            typeName = dictionary.Add(dataContractType.FullName);
            typeNamespace = dictionary.Add(dataContractType.Assembly.FullName);
        }
    }
}

Per utilizzare questo esempio

  1. Utilizzando Visual Studio 2010, aprire il file della soluzione DCRSample.sln.

  2. Fare clic con il pulsante destro del mouse sul file della soluzione e scegliere Proprietà.

  3. Nella finestra di dialogo Pagine proprietà soluzione, in Proprietà comuni, Progetto di avvio, selezionare Progetti di avvio multipli:.

  4. Accanto al progetto DCSwithDCR, selezionare Avvia dall'elenco a discesa Azione.

  5. Accanto al progetto NetDCS, selezionare Avvia dall'elenco a discesa Azione.

  6. Scegliere OK per chiudere la finestra di dialogo.

  7. Per compilare la soluzione, premere F6.

  8. Per eseguire la soluzione, premere CTRL+F5.

Ee621289.Important(it-it,VS.100).gif Nota:
È possibile che gli esempi siano già installati nel computer. Verificare la directory seguente (impostazione predefinita) prima di continuare.

<UnitàInstallazione>:\WF_WCF_Samples

Se questa directory non esiste, andare alla pagina relativa agli esempi di Windows Communication Foundation (WCF) e Windows Workflow Foundation (WF) per .NET Framework 4 per scaricare tutti gli esempi di Windows Communication Foundation (WCF) e WF. Questo esempio si trova nella directory seguente.

<UnitàInstallazione>:\WF_WCF_Samples\WCF\Basic\Contract\Data\NetDcSasDcSwithDCR