Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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 ardından onları serileştirir ve seri durumdan çıkarır. DataContractResolver, aşağıdaki örnekte gösterildiği gibi, DataContractResolver-türetilmiş sınıfının bir örneği DataContractSerializer oluşturucusuna geçirilerek serileştirme sürecine dahil edilir.
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 DataContractResolverDataContractSerializer oluşturucusuna geçirildiğinden, serileştirme sırasında bir CLR türünü eşdeğer bir TryResolveType ile eşlemek için xsi:type ç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
Visual Studio'yu kullanarak DCRSample.sln çözüm dosyasını açın.
Çözümü çalıştırmak için F5 tuşuna basın.