serialized serialize serializacion deserialize deserializacion and c# .net serialization

serialize - Deserializar XML a objetos en C#



serialization and deserialization in c# (8)

Bueno, tendría que tener clases en su ensamblaje que coincidan, más o menos, con el XML (propiedad llamada Private, una propiedad de colección llamada ToDo, etc.).

El problema es que el XML tiene elementos que no son válidos para los nombres de las clases . Por lo tanto, debe implementar IXmlSerializable en estas clases para controlar cómo se serializan desde y hacia XML. También puede salirse con la suya usando algunos de los atributos específicos de serialización xml, pero eso depende del esquema de su xml.

Eso es un paso más arriba usando la reflexión, pero puede que no sea exactamente lo que estás esperando.

Entonces tengo xml que se ve así:

<todo-list> <id type="integer">#{id}</id> <name>#{name}</name> <description>#{description}</description> <project-id type="integer">#{project_id}</project-id> <milestone-id type="integer">#{milestone_id}</milestone-id> <position type="integer">#{position}</position> <!-- if user can see private lists --> <private type="boolean">#{private}</private> <!-- if the account supports time tracking --> <tracked type="boolean">#{tracked}</tracked> <!-- if todo-items are included in the response --> <todo-items type="array"> <todo-item> ... </todo-item> <todo-item> ... </todo-item> ... </todo-items> </todo-list>

¿Cómo podría utilizar la biblioteca de serialización de .NET para deserializar esto en objetos C #?

Actualmente estoy usando la reflexión y mapeo entre el xml y mis objetos usando las convenciones de nomenclatura.


Cree una clase para cada elemento que tenga una propiedad para cada elemento y una Lista o matriz de objetos (use la creada) para cada elemento secundario. Luego llame a System.Xml.Serialization.XmlSerializer.Deserialize en la cadena y eche el resultado como su objeto. Use los atributos System.Xml.Serialization para realizar ajustes, como asignar el elemento a su clase ToDoList, use el atributo XmlElement ("todo-list").

Un shourtcut es cargar su XML en Visual Studio, hacer clic en el botón "Inferir esquema" y ejecutar "xsd.exe / c schema.xsd" para generar las clases. xsd.exe está en la carpeta de herramientas. A continuación, revise el código generado y haga los ajustes necesarios, como cambiar de pantalón corto a blanco.



Deserializar cualquier objeto, siempre que el tipo T esté marcado Serializable:

function T Deserialize<T>(string serializedResults) { var serializer = new XmlSerializer(typeof(T)); using (var stringReader = new StringReader(serializedResults)) return (T)serializer.Deserialize(stringReader); }


Hay un par de opciones diferentes.

  • Visual Studio incluye un programa de línea de comando llamado xsd.exe. Utiliza ese programa para crear un documento de esquema y usa el programa nuevamente en el documento de esquema para crear clases que puedes usar con system.xml.serialization.xmlserializer
  • Es posible que solo pueda llamar a Dataset.ReadXml () en él.


Se reduce a usar xsd.exe desde herramientas en VS:

xsd.exe "%xsdFile%" /c /out:"%outDirectory%" /l:"%language%"

Luego cárguelo con lector y deserializador:

public GeneratedClassFromXSD GetObjectFromXML() { var settings = new XmlReaderSettings(); var obj = new GeneratedClassFromXSD(); var reader = XmlReader.Create(urlToService, settings); var serializer = new System.Xml.Serialization.XmlSerializer(typeof(GeneratedClassFromXSD)); obj = (GeneratedClassFromXSD)serializer.Deserialize(reader); reader.Close(); return obj; }


tuve las mismas preguntas hace unos años que cómo mapear xml a clases de C # o crear clases de C # que se asignan a nuestros XML, JST como hacemos en el marco de la entidad (asignamos tablas a clases de C #). Creé un framework finalmente, que puede crear clases C # a partir de su XML y estas clases se pueden utilizar para leer / escribir su xml. Echa un look