Condividi tramite


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

L’esempio NetDcSasDcSwithDCR 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);
        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 usare questo esempio

  1. In Visual Studio, 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. Fare clic su OK per chiudere la finestra di dialogo.

  7. Per compilare la soluzione, premere CTRL+MAIUSC+B.

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