Tengo una clase C # que heredé. He "construido" con éxito el objeto. Pero necesito serializar el objeto a XML. ¿Hay una manera fácil de hacerlo?
Parece que la clase se ha configurado para la serialización, pero no estoy seguro de cómo obtener la representación XML. Mi definición de clase se ve así:
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.1")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://www.domain.com/test")]
[System.Xml.Serialization.XmlRootAttribute(Namespace = "http://www.domain.com/test", IsNullable = false)]
public partial class MyObject
{
...
}
Esto es lo que pensé que podía hacer, pero no funciona:
MyObject o = new MyObject();
// Set o properties
string xml = o.ToString();
¿Cómo obtengo la representación XML de este objeto?
c#
xml-serialization
usuario462166
fuente
fuente
Respuestas:
Debe usar XmlSerializer para la serialización XML. A continuación se muestra un fragmento de muestra.
fuente
XmlWriter writer = XmlWriter.Create(sww);
XmlTextWriter writer = new XmlTextWriter(sww) { Formatting = Formatting.Indented };
lugar deXmlWriter writer = XmlWriter.Create(sww);
XmlWriter
encapsula elStringWriter
no necesita deshacerse de ambos (el primer uso es redundante), ¿verdad? Estoy asumiendo queXmlWriter
se encarga de deshacerse de él ...XmlWriter
no está encapsulando elStringWriter
, está utilizando su transferenciaStringWriter
y no tiene ninguna expectativa / responsabilidad de deshacerse de él. AdemásStringWriter
está fueraXmlWriter
del alcance, aún puede desearlo cuando lo desecheXmlWriter
, sería un mal comportamientoXmlWriter
deshacerse de élStringWriter
. Como regla general, si declaras algo que necesita ser eliminado, eres responsable de deshacerte de él. E implícito en esa regla, cualquier cosa que no declares no debes deshacerte. Entonces ambosusing
s son necesarios.Modifiqué el mío para devolver una cadena en lugar de usar una variable de referencia como a continuación.
Su uso sería así:
fuente
Exception
allí, has extendido el StackTrace con el método "Serialize <>".La siguiente función se puede copiar a cualquier objeto para agregar una función de guardar XML utilizando el espacio de nombres System.Xml.
Para crear el objeto a partir del archivo guardado, agregue la siguiente función y reemplace [ObjectType] con el tipo de objeto a crear.
fuente
writer.Flush()
es redundante en unusing
bloque -writer
elDispose()
método lo vaciará por usted.Clase de extensión:
Uso:
Simplemente hacer referencia al espacio de nombres de la celebración de su método de extensión en el archivo que desea utilizar y en que va a trabajar (en mi ejemplo sería:
using MyProj.Extensions;
)Tenga en cuenta que si desea hacer que el método de extensión sea específico solo para una clase en particular (por ejemplo,
Foo
), puede reemplazar elT
argumento en el método de extensión, por ejemplo.public static string Serialize(this Foo value){...}
fuente
Puede usar la función que se muestra a continuación para obtener XML serializado de cualquier objeto.
Puedes llamar a esto desde el cliente.
fuente
Para serializar un objeto, haga:
También recuerde que para que XmlSerializer funcione, necesita un constructor sin parámetros.
fuente
Comenzaré con la copia de la respuesta de Ben Gripka:
Usé este código antes. Pero la realidad mostró que esta solución es un poco problemática. Por lo general, la mayoría de los programadores solo serializan la configuración al guardar y deserializan la configuración al cargar. Este es un escenario optimista. Una vez que la serialización falló, por alguna razón, el archivo está parcialmente escrito, el archivo XML no está completo y no es válido. En consecuencia, la deserialización XML no funciona y su aplicación puede bloquearse al inicio. Si el archivo no es enorme, sugiero primero serializar el objeto para
MemoryStream
luego escribir la secuencia en el Archivo. Este caso es especialmente importante si hay alguna serialización personalizada complicada. Nunca puedes probar todos los casos.La deserialización en el escenario del mundo real debe contar con un archivo de serialización dañado, sucede en algún momento. La función de carga proporcionada por Ben Gripka está bien.
Y podría estar envuelto por algún escenario de recuperación. Es adecuado para archivos de configuración u otros archivos que se pueden eliminar en caso de problemas.
fuente
Todas las respuestas votadas arriba son correctas. Esta es la versión más simple:
fuente
Es un poco más complicado que llamar al
ToString
método de la clase, pero no mucho.Aquí hay una función simple que puede usar para serializar cualquier tipo de objeto. Devuelve una cadena que contiene los contenidos XML serializados:
fuente
Aquí hay un buen tutorial sobre cómo hacer esto
Básicamente deberías usar
System.Xml.Serialization.XmlSerializer
class para hacer esto.fuente
Puede crear y almacenar el resultado como archivo xml en la ubicación deseada.
fuente
Mi código de trabajo. Devuelve utf8 xml habilitar espacio de nombres vacío.
Ejemplo devuelve respuesta Yandex api pago Aviso url:
fuente
Tengo una manera simple de serializar un objeto a XML usando C #, funciona muy bien y es altamente reutilizable. Sé que este es un hilo antiguo, pero quería publicar esto porque alguien puede encontrar esto útil para ellos.
Así es como llamo al método:
Aquí está la clase que hace el trabajo:
Nota: Dado que estos son métodos de extensión, deben estar en una clase estática.
fuente
Basado en las soluciones anteriores, aquí viene una clase de extensión que puede usar para serializar y deserializar cualquier objeto. Cualquier otra atribución XML depende de usted.
Solo úsalo así:
fuente
O puede agregar este método a su objeto:
fuente
Aquí hay un código básico que ayudará a serializar los objetos de C # en xml:
fuente
Necesita usar las siguientes clases:
fuente