Oharra
Orrialde honetara sartzeak baimena behar du. Saioa hasteko edo direktorioak aldatzen saia zaitezke.
Orrialde honetara sartzeak baimena behar du. Direktorioak aldatzen saia zaitezke.
En el ejemplo DataContractResolver se muestra cómo se pueden personalizar los procesos de serialización y deserialización mediante la DataContractResolver clase . En este ejemplo se muestra cómo usar DataContractResolver para asignar tipos CLR hacia y desde una representación xsi:type durante la serialización y deserialización.
Detalles de ejemplo
En el ejemplo se definen los siguientes tipos CLR.
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
{
}
}
El ejemplo carga el ensamblado, extrae cada uno de estos tipos y, a continuación, los serializa y deserializa. El DataContractResolver se incorpora al proceso de serialización pasando una instancia de la clase derivada DataContractResolver al constructor DataContractSerializer, como se muestra en el ejemplo siguiente.
this.serializer = new DataContractSerializer(typeof(Object), null, int.MaxValue, false, true, null, new MyDataContractResolver(assembly));
A continuación, el ejemplo serializa los tipos CLR como se muestra en el ejemplo de código siguiente.
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());
}
A continuación, el ejemplo deserializa los tipos xsi:types, como se muestra en el ejemplo de código siguiente.
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);
}
}
Dado que el objeto DataContractResolver personalizado se pasa en el constructor DataContractSerializer, el método TryResolveType se llama durante la serialización para asignar un tipo CLR a un xsi:type equivalente. Del mismo modo, se llama al ResolveName durante la deserialización para asignar el xsi:type a un tipo CLR equivalente. En este ejemplo, DataContractResolver se define como se muestra en el ejemplo siguiente.
El ejemplo de código siguiente es una clase derivada de 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);
}
}
}
Como parte del ejemplo, el proyecto Types genera el ensamblado con todos los tipos que se usan en este ejemplo. Use este proyecto para agregar, quitar o modificar los tipos que se serializarán.
Para utilizar este ejemplo
Con Visual Studio, abra el archivo de solución DCRSample.sln.
Para ejecutar la solución, presione F5.