DataContractResolverDataContractResolver

В этом образце показано, как можно настроить процессы сериализации и десериализации с помощью класса DataContractResolver.This sample demonstrates how the serialization and deserialization processes can be customized by using the DataContractResolver class. Этот образец демонстрирует применение класса DataContractResolver для сопоставления типов CLR с представлением xsi:type во время сериализации и десериализации.This sample shows how to use a DataContractResolver to map CLR types to and from an xsi:type representation during serialization and deserialization.

Подробные сведения об образцеSample Details

В образце определяются следующие типы CLR.The sample defines the following CLR types.

using System;
using System.Runtime.Serialization;

namespace Types
{
    [DataContract]
    public class Customer
    {
        [DataMember]
        public string Name { get; set; }
    }

    [DataContract]
    public class VIPCustomer : Customer
    {
        [DataMember]
        public string VipInfo { get; set; }
    }

    [DataContract]
    public class RegularCustomer : Customer
    {
    }

    [DataContract]
    public class PreferredVIPCustomer : VIPCustomer
    {
    }
}

Образец загружает сборку, извлекает каждый из следующих типов, а затем сериализует и десериализует их.The sample loads the assembly, extracts each of these types, and then serializes and deserializes them. Как показано в следующем примере, класс DataContractResolver участвует в процессе сериализации, передавая экземпляр производного класса DataContractResolver в конструктор DataContractSerializer.The DataContractResolver is plugged into the serialization process by passing an instance of the DataContractResolver-derived class to the DataContractSerializer constructor, as shown in the following example.

this.serializer = new DataContractSerializer(typeof(Object), null, int.MaxValue, false, true, null, new MyDataContractResolver(assembly));

Затем образец сериализует типы CLR, как показано в следующем примере программного кода.The sample then serializes the CLR types as shown in the following code example.

Assembly assembly = Assembly.Load(new AssemblyName("Types"));

public void serialize(Type type)
{
    Object instance = Activator.CreateInstance(type);

    Console.WriteLine("----------------------------------------");
    Console.WriteLine();
    Console.WriteLine("Serializing type: {0}", type.Name);
    Console.WriteLine();
    this.buffer = new StringBuilder();
    using (XmlWriter xmlWriter = XmlWriter.Create(this.buffer))
    {
        try
        {
            this.serializer.WriteObject(xmlWriter, instance);
        }
        catch (SerializationException error)
        {
            Console.WriteLine(error.ToString());
        }
    }
    Console.WriteLine(this.buffer.ToString());
}

Затем образец десериализует типы xsi:type, как показано в следующем примере программного кода.The sample then deserializes the xsi:types as shown in the following code example.

public void deserialize(Type type)
{
    Console.WriteLine();
    Console.WriteLine("Deserializing type: {0}", type.Name);
    Console.WriteLine();
    using (XmlReader xmlReader = XmlReader.Create(new StringReader(this.buffer.ToString())))
    {
        Object obj = this.serializer.ReadObject(xmlReader);
    }
}

Поскольку пользовательский класс DataContractResolver передается в конструктор DataContractSerializer, во время сериализации вызывается метод TryResolveType, чтобы сопоставить тип CLR с эквивалентным элементом xsi:type.Since the custom DataContractResolver is passed in to the DataContractSerializer constructor, the TryResolveType is called during serialization to map a CLR type to an equivalent xsi:type. Аналогично во время десериализации вызывается метод ResolveName, чтобы сопоставить элемент xsi:type с эквивалентным типом CLR.Similarly the ResolveName is called during deserialization to map the xsi:type to an equivalent CLR type. В этом образце DataContractResolver определен, как показано в следующем примере.In this sample, the DataContractResolver is defined as shown in the following example.

В следующем примере кода представлен класс, являющийся производным от DataContractResolver.The following code example is a class deriving from DataContractResolver.

class MyDataContractResolver : DataContractResolver
{
    private Dictionary<string, XmlDictionaryString> dictionary = new Dictionary<string, XmlDictionaryString>();
    Assembly assembly;

    public MyDataContractResolver(Assembly assembly)
    {
        this.assembly = assembly;
    }

    // Used at deserialization
    // Allows users to map xsi:type name to any Type
    public override Type ResolveName(string typeName, string typeNamespace, DataContractResolver knownTypeResolver)
    {
        XmlDictionaryString tName;
        XmlDictionaryString tNamespace;
        if (dictionary.TryGetValue(typeName, out tName) && dictionary.TryGetValue(typeNamespace, out tNamespace))
        {
            return this.assembly.GetType(tNamespace.Value + "." + tName.Value);
        }
        else
        {
            return null;
        }
    }

    // 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)
    {
        string name = dataContractType.Name;
        string namesp = dataContractType.Namespace;
        typeName = new XmlDictionaryString(XmlDictionary.Empty, name, 0);
        typeNamespace = new XmlDictionaryString(XmlDictionary.Empty, namesp, 0);
        if (!dictionary.ContainsKey(dataContractType.Name))
        {
            dictionary.Add(name, typeName);
        }
        if (!dictionary.ContainsKey(dataContractType.Namespace))
        {
            dictionary.Add(namesp, typeNamespace);
        }
    }
}

Будучи частью образца, проект «Type» создает сборку со всеми типами, которые используются в этом образце.As part of the sample, the Types project generates the assembly with all the types that are used in this sample. Используйте этот проект для добавления, удаления или изменения типов, которые будут сериализованы.Use this project to add, remove or modify the types that will be serialized.

Использование этого образцаTo use this sample

  1. С помощью Visual Studio 2012 откройте файл решения Дкрсампле. sln.Using Visual Studio 2012, open the DCRSample.sln solution file.

  2. Чтобы запустить решение, нажмите клавишу F5.To run the solution, press F5

Важно!

Образцы уже могут быть установлены на компьютере.The samples may already be installed on your machine. Перед продолжением проверьте следующий каталог (по умолчанию).Check for the following (default) directory before continuing.

<InstallDrive>:\WF_WCF_Samples

Если этот каталог не существует, перейдите к примерам Windows Communication Foundation (WCF) и Windows Workflow Foundation (WF) для .NET Framework 4 , чтобы скачать все Windows Communication Foundation (WCF) и WFWF примеры.If this directory does not exist, go to Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4 to download all Windows Communication Foundation (WCF) and WFWF samples. Этот образец расположен в следующем каталоге.This sample is located in the following directory.

<InstallDrive>:\WF_WCF_Samples\WCF\Basic\Contract\Data\DataContractResolver

См. такжеSee also