DataContractResolver

DataContractResolver örneği, serileştirme ve seri durumdan çıkarma işlemlerinin sınıfı kullanılarak DataContractResolver nasıl özelleştirilebileceğini gösterir. Bu örnek, serileştirme ve seri durumdan çıkarma sırasında CLR türlerini xsi:type gösterimine eşlemek için DataContractResolver'ın nasıl kullanılacağını gösterir.

Örnek Ayrıntılar

Örnek aşağıdaki CLR türlerini tanımlar.

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
    {
    }
}

Örnek derlemeyi yükler, bu türlerin her birini ayıklar ve sonra seri hale getirerek seri durumdan çıkarır. DataContractResolver, aşağıdaki örnekte gösterildiği gibi - türetilmiş sınıfın DataContractResolverbir örneğini oluşturucuya DataContractSerializer geçirerek serileştirme işlemine eklenir.

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

Örnek daha sonra aşağıdaki kod örneğinde gösterildiği gibi CLR türlerini seri hale getirmektedir.

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

Örnek daha sonra aşağıdaki kod örneğinde gösterildiği gibi xsi:types dosyasını seri durumdan çıkartır.

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

Özel DataContractResolver oluşturucuya geçirildiğinden DataContractSerializer , TryResolveType clr türünü eşdeğer xsi:typebir ile eşlemek için serileştirme sırasında çağrılır. Benzer şekilde, ResolveName öğesini eşdeğer bir CLR türüyle eşlemek için seri durumdan xsi:type çıkarma sırasında çağrılır. Bu örnekte, DataContractResolver aşağıdaki örnekte gösterildiği gibi tanımlanır.

Aşağıdaki kod örneği, öğesinden DataContractResolvertüretilen bir sınıftır.

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

Örneğin bir parçası olarak Types projesi, bu örnekte kullanılan tüm türlerle derlemeyi oluşturur. Seri hale getirilecek türleri eklemek, kaldırmak veya değiştirmek için bu projeyi kullanın.

Bu örneği kullanmak için

  1. Visual Studio'yu kullanarak DCRSample.sln çözüm dosyasını açın.

  2. Çözümü çalıştırmak için F5 tuşuna basın.

Ayrıca bkz.