Udostępnij przez


Używanie elementu DataContractSerializer i DataContractResolver w celu udostępnienia funkcji NetDataContractSerializer

Przykład NetDcSasDcSwithDCR pokazuje, jak użycie DataContractSerializer z odpowiednim DataContractResolver zapewnia taką samą funkcjonalność jak NetDataContractSerializer. W tym przykładzie pokazano, jak utworzyć odpowiednie DataContractResolver i jak dodać go do elementu DataContractSerializer.

Przykładowe szczegóły

NetDataContractSerializer różni się od DataContractSerializer pod jednym ważnym względem: NetDataContractSerializer zawiera informacje o typie CLR w serializowanym XML, natomiast DataContractSerializer nie. W związku z tym, NetDataContractSerializer można użyć tylko wtedy, gdy obie strony serializacji i deserializacji dzielą się tymi samymi typami CLR. Zaleca się jednak użycie DataContractSerializer go, ponieważ jego wydajność jest lepsza niż NetDataContractSerializer. Można zmienić informacje serializowane w DataContractSerializer, dodając do nich DataContractResolver.

Ten przykład składa się z dwóch projektów. Pierwszy projekt używa NetDataContractSerializer metody do serializacji obiektu. Drugi projekt używa DataContractSerializer wraz z DataContractResolver aby zapewnić taką samą funkcjonalność jak pierwszy projekt.

Poniższy przykład kodu przedstawia implementację niestandardowego elementu DataContractResolver jako nazwy MyDataContractResolver, który jest dodawany do DataContractSerializer w projekcie 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);
        }
    }
}

Aby skorzystać z tego przykładu

  1. Za pomocą programu Visual Studio otwórz plik rozwiązania DCRSample.sln.

  2. Kliknij prawym przyciskiem myszy plik rozwiązania i wybierz polecenie Właściwości.

  3. W oknie dialogowym Strony właściwości rozwiązania w obszarze Typowe właściwości, Projekt startowy wybierz pozycję Wiele projektów startowych:.

  4. Obok projektu DCSwithDCR wybierz pozycję Rozpocznij z listy rozwijanej Akcja .

  5. Obok projektu NetDCS wybierz pozycję Rozpocznij z listy rozwijanej Akcja .

  6. Kliknij przycisk OK , aby zamknąć okno dialogowe.

  7. Aby skompilować rozwiązanie, naciśnij Ctrl+Shift+B.

  8. Aby uruchomić rozwiązanie, naciśnij Ctrl+F5.