Delen via


DataContractSerializer en DataContractResolver gebruiken om de functionaliteit van NetDataContractSerializer te bieden

Het NetDcSasDcSwithDCR-voorbeeld laat zien hoe het gebruik van DataContractSerializer een geschikte DataContractResolver functie dezelfde functionaliteit biedt als NetDataContractSerializer. In dit voorbeeld ziet u hoe u de juiste DataContractResolver maakt en hoe u het toevoegt aan de DataContractSerializer.

Voorbeelddetails

NetDataContractSerializer verschilt van DataContractSerializer op een belangrijke manier: NetDataContractSerializer bevat CLR-typegegevens in de geserialiseerde XML, terwijl DataContractSerializer dat niet het geval is. NetDataContractSerializer Daarom kan alleen worden gebruikt als zowel het serialiseren als deserialiseren eindigt dezelfde CLR-typen delen. Het wordt echter aanbevolen om te gebruiken DataContractSerializer omdat de prestaties beter zijn dan NetDataContractSerializer. U kunt de informatie wijzigen waarin wordt geserialiseerd DataContractSerializer door er een DataContractResolver aan toe te voegen.

Dit voorbeeld bestaat uit twee projecten. Het eerste project gebruikt NetDataContractSerializer om een object te serialiseren. Het tweede project maakt gebruik DataContractSerializer van een DataContractResolver om dezelfde functionaliteit te bieden als het eerste project.

In het volgende codevoorbeeld ziet u de implementatie van een aangepaste DataContractResolver naam MyDataContractResolver die wordt toegevoegd aan het DataContractSerializer dcSwithDCR-project.

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

Dit voorbeeld gebruiken

  1. Open met Visual Studio het DCRSample.sln-oplossingsbestand.

  2. Klik met de rechtermuisknop op het oplossingsbestand en kies Eigenschappen.

  3. Selecteer in het dialoogvenster Pagina's met oplossingseigenschappen, onder Algemene eigenschappen, Opstartproject, meerdere opstartprojecten:.

  4. Selecteer Naast het DCSwithDCR-project de optie Starten in de vervolgkeuzelijst Actie .

  5. Selecteer Naast het NetDCS-project de optie Starten in de vervolgkeuzelijst Actie .

  6. Klik op OK om het dialoogvenster te sluiten.

  7. Druk op Ctrl+Shift+B om de oplossing te bouwen.

  8. Druk op Ctrl+F5 om de oplossing uit te voeren.