Sdílet prostřednictvím


Použití DataContractSerializer a DataContractResolver pro zajištění funkcí NetDataContractSerializer

Ukázka NetDcSasDcSwithDCR ukazuje, jak použití DataContractSerializer s odpovídajícími DataContractResolver funkcemi poskytuje stejné funkce jako NetDataContractSerializer. Tato ukázka ukazuje, jak vytvořit odpovídající DataContractResolver a jak ho přidat do objektu DataContractSerializer.

Ukázkové podrobnosti

NetDataContractSerializer liší se od DataContractSerializer jednoho důležitého způsobu: NetDataContractSerializer obsahuje informace o typu CLR v serializovaném XML, zatímco DataContractSerializer ne. Proto lze použít pouze v případě, NetDataContractSerializer že serializace i deserializace končí sdílet stejné typy CLR. Doporučuje se však použít DataContractSerializer , protože jeho výkon je lepší než NetDataContractSerializer. Informace, které jsou serializovány DataContractSerializer , můžete změnit tak, že do ní přidáte DataContractResolver .

Tato ukázka se skládá ze dvou projektů. První projekt používá NetDataContractSerializer k serializaci objektu. Druhý projekt používá se DataContractSerializerDataContractResolver stejnou funkcí jako první projekt.

Následující příklad kódu ukazuje implementaci vlastního DataContractResolver názvu MyDataContractResolver , který je přidán do DataContractSerializer projektu 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);
        }
    }
}

Použití této ukázky

  1. V sadě Visual Studio otevřete soubor řešení DCRSample.sln.

  2. Klikněte pravým tlačítkem myši na soubor řešení a zvolte Vlastnosti.

  3. V dialogovém okně Stránky vlastností řešení v části Společné vlastnosti, Spouštěný projekt vyberte Více projektů po spuštění:.

  4. Vedle projektu DCSwithDCR vyberte Spustit z rozevíracího seznamu Akce.

  5. Vedle projektu NetDCS v rozevíracím seznamu Akce vyberte Spustit.

  6. Kliknutím na tlačítko OK zavřete dialogové okno.

  7. Řešení sestavíte stisknutím kláves Ctrl+Shift+B.

  8. Řešení spustíte stisknutím kláves Ctrl+F5.