serialize serializar objeto into how c# xml serialization

c# - objeto - Cómo XML serializar un ''Tipo''



serialize string to xml c# (6)

Podría implementar potencialmente la interfaz IXmlSerializable y usar Type.FullName (también puede necesitar Type.AssemblyQualifiedName ) para la serialización y Assembly.GetType(string) para la deserialización de su elemento de tipo.

¿Cómo serializo un ''Tipo''?

Quiero serializar en XML un objeto que tiene una propiedad que es un tipo de objeto. La idea es que cuando se deserialice puedo crear un objeto de ese tipo.

public class NewObject { } [XmlRoot] public class XmlData { private Type t; public Type T { get { return t; } set { t = value; } } } static void Main(string[] args) { XmlData data = new XmlData(); data.T = typeof(NewObject); try { XmlSerializer serializer = new XmlSerializer(typeof(XmlData)); try { using (FileStream fs = new FileStream("test.xml", FileMode.Create)) { serializer.Serialize(fs, data); } } catch (Exception ex) { } } catch (Exception ex) { } }

Obtengo esta excepción: "No se esperaba el tipo ConsoleApplication1.NewObject. Use el atributo XmlInclude o SoapInclude para especificar tipos que no se conocen estáticamente".

¿Dónde pongo el [XmlInclude]? ¿Esto es posible?


Terminé convirtiendo el nombre de Tipo en una cadena para guardarlo en XML.

Cuando deserializo, cargo todas las DLL y guardo el nombre del tipo y escribo en un diccionario. Cuando cargo el XML con el Nombre del Tipo, puedo buscar el nombre en la clave del diccionario y conocer el tipo en función del valor del diccionario.


El problema es que el tipo de XmlData.T es en realidad "System.RuntimeType" (una subclase de Tipo), que desafortunadamente no es pública. Esto significa que no hay forma de decirle a la serialización qué tipos esperar. Sugiero solo serializar el nombre del tipo, o nombre completo como lo sugiere Jay Bazuzi.


La serialización XML serializa solo los campos públicos y los valores de propiedad de un objeto en una secuencia XML. La serialización XML no incluye información de tipo. Por ejemplo, si tiene un objeto Book que existe en el espacio de nombres de la Biblioteca, no hay garantía de que se deserialice en un objeto del mismo tipo.

Fuente: MSDN: Introducción a la serialización XML


Feo, pero funciona. Cree una clase que incluya el tipo de objeto y la cadena serializada.

ex

Class dummie { Type objType; string xml; }


Type clase de Type no se puede serializar porque System.RuntimeType no es accesible para nuestro código, es un tipo de CLR interno. Puede solucionar esto utilizando el nombre del tipo, como este:

public class c { [XmlIgnore] private Type t; [XmlIgnore] public Type T { get { return t; } set { t = value; tName = value.AssemblyQualifiedName; } } public string tName{ get { return t.AssemblyQualifiedName; } set { t = Type.GetType(value);} } }