Dela via


Använda DataContractSerializer och DataContractResolver för att tillhandahålla funktionerna i NetDataContractSerializer

Exemplet NetDcSasDcSwithDCR visar hur användningen av DataContractSerializer med en lämplig DataContractResolver ger samma funktioner som NetDataContractSerializer. Det här exemplet visar hur du skapar lämpliga DataContractResolver och hur du lägger till den i DataContractSerializer.

Exempelinformation

NetDataContractSerializer skiljer sig från DataContractSerializer på ett viktigt sätt: NetDataContractSerializer innehåller CLR-typinformation i serialiserad XML, men DataContractSerializer inte. NetDataContractSerializer Därför kan endast användas om både serialiserings- och deserialiseringssluten delar samma CLR-typer. Det rekommenderas dock att använda DataContractSerializer eftersom dess prestanda är bättre än NetDataContractSerializer. Du kan ändra den information som serialiseras i DataContractSerializer genom att lägga till en DataContractResolver i den.

Det här exemplet består av två projekt. Det första projektet använder NetDataContractSerializer för att serialisera ett objekt. Det andra projektet använder DataContractSerializer med en DataContractResolver för att tillhandahålla samma funktioner som det första projektet.

I följande kodexempel visas implementeringen av ett anpassat DataContractResolver namn MyDataContractResolver som läggs till DataContractSerializer i i DCSwithDCR-projektet.

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

Så här använder du det här exemplet

  1. Använd Visual Studio och öppna DCRSample.sln lösningsfilen.

  2. Högerklicka på lösningsfilen och välj Egenskaper.

  3. I dialogrutan Lösningsegenskapssidor går du till Vanliga egenskaper, Startprojekt och väljer Flera startprojekt:.

  4. Bredvid DCSwithDCR-projektet väljer du Starta i listrutan Åtgärd .

  5. Bredvid NetDCS-projektet väljer du Starta i listrutan Åtgärd .

  6. Stäng dialogrutan genom att klicka på OK .

  7. Tryck på Ctrl+Skift+B för att skapa lösningen.

  8. Om du vill köra lösningen trycker du på Ctrl+F5.