Bereitstellen der Funktionen für NetDataContractSerializer mit DataContractSerializer und DataContractResolver

In dem NetDcSasDcSwithDCR-Beispiel wird veranschaulicht, wie die Verwendung von DataContractSerializer mit einem entsprechenden DataContractResolver die gleiche Funktionalität wie der NetDataContractSerializer bereitstellt. In diesem Beispiel wird gezeigt, wie der entsprechende DataContractResolver erstellt und dem DataContractSerializer hinzugefügt wird.

Beispieldetails

NetDataContractSerializer unterscheidet sich von DataContractSerializer in einem wichtigen Punkt: NetDataContractSerializer enthält im Gegensatz zu DataContractSerializer CLR-Typinformationen im serialisierten XML. NetDataContractSerializer kann daher nur verwendet werden, wenn sowohl der Endpunkt für die Serialisierung als auch der Endpunkt für die Deserialisierung den gleichen CLR-Typ aufweisen. Es wird jedoch empfohlen, DataContractSerializer zu verwenden, da er eine höhere Leistung bietet als NetDataContractSerializer. Sie können die Informationen ändern, die in DataContractSerializer serialisiert sind, indem Sie einen DataContractResolver hinzuzufügen.

Dieses Beispiel besteht aus zwei Projekten. Das erste Projekt verwendet NetDataContractSerializer für das Serialisieren eines Objekts. Das zweite Projekt verwendet DataContractSerializer mit einem DataContractResolver, um die gleiche Funktionalität wie das erste Projekt bereitzustellen.

Im folgenden Codebeispiel wird die Implementierung von einem benutzerdefinierten DataContractResolver mit dem Namen MyDataContractResolver veranschaulicht, der dem DataContractSerializer im DCSwithDCR-Projekt hinzugefügt wird.

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

So verwenden Sie dieses Beispiel

  1. Öffnen Sie mit Visual Studio die Projektmappe DCRSample.sln.

  2. Klicken Sie mit der rechten Maustaste auf die Projektmappendatei, und wählen Sie Eigenschaften aus.

  3. Wählen Sie im Dialogfeld Eigenschaftenseiten der Projektmappe unter Allgemeine Eigenschaften, Startprojekt die Option Mehrere Startprojekte aus.

  4. Wählen Sie neben dem Projekt DCSwithDCR aus der Dropdownliste Aktion die Option Start aus.

  5. Wählen Sie neben dem Projekt NetDCS aus der Dropdownliste Aktion die Option Start aus.

  6. Klicken Sie auf OK, um das Dialogfeld zu schließen.

  7. Drücken Sie STRG+UMSCHALT+B, um die Projektmappe zu erstellen.

  8. Drücken Sie STRG+F5, um die Projektmappe auszuführen.