serialize serializar serializacion objeto ejemplo deserialize deserializar and c# .net xml-serialization visual-studio-2003

c# - serializacion - Omitir instrucción de procesamiento XML al serializar un objeto



serialize and deserialize in c# (6)

Estoy serializando un objeto en una aplicación C # VS2003 / .Net 1.1. Sin embargo, lo necesito serializado sin las instrucciones de procesamiento. La clase XmlSerializer saca algo como esto:

<?xml version="1.0" encoding="utf-16" ?> <MyObject> <Property1>Data</Property1> <Property2>More Data</Property2> </MyObject>

¿Hay alguna forma de obtener algo como lo siguiente, sin procesar el texto resultante para eliminar la etiqueta?

<MyObject> <Property1>Data</Property1> <Property2>More Data</Property2> </MyObject>

Para aquellos que son curiosos, mi código se ve así ...

XmlSerializer serializer = new XmlSerializer(typeof(MyObject)); StringBuilder builder = new StringBuilder(); using ( TextWriter stringWriter = new StringWriter(builder) ) { serializer.Serialize(stringWriter, comments); return builder.ToString(); }


En 2.0, usaría XmLWriterSettings.OmitXmlDeclaration , y serializaría a un XmlWriter; sin embargo, no creo que esto exista en 1.1; por lo tanto, no del todo útil, pero solo una cosa más de "considerar la actualización" ... y sí, me doy cuenta de que no siempre es posible.


Si por "instrucción de procesamiento" te refieres a la declaración xml, entonces puedes evitar esto configurando la propiedad OmitXmlDeclaration de XmlWriterSettings. Tendrá que serializar usando un XmlWriter, para lograr esto.

XmlSerializer serializer = new XmlSerializer(typeof(MyObject)); StringBuilder builder = new StringBuilder(); XmlWriterSettings settings = new XmlWriterSettings(); settings.OmitXmlDeclaration = true; using ( XmlWriter stringWriter = new StringWriter(builder, settings) ) { serializer.Serialize(stringWriter, comments); return builder.ToString(); }

Pero ah, esto no responde tu pregunta para 1.1. Bueno, para referencia a otros.


Hice una pequeña corrección

XmlSerializer serializer = new XmlSerializer(typeof(MyObject)); StringBuilder builder = new StringBuilder(); XmlWriterSettings settings = new XmlWriterSettings(); settings.OmitXmlDeclaration = true; using ( XmlWriter stringWriter = XmlWriter.Create(builder, settings) ) { serializer.Serialize(stringWriter, comments); return builder.ToString(); }


¿Qué hay de omitir espacios de nombres?

En lugar de usar

XmlSerializerNamespaces namespaces = new XmlSerializerNamespaces(); namespaces.Add("", "");

ex:

<message xmlns:xsi=/"http://www.w3.org/2001/XMLSchema-instance/" xmlns:xsd=/"http://www.w3.org/2001/XMLSchema/">


Esto funciona en .NET 1.1. (Pero aún debes considerar actualizar)

XmlSerializer s1= new XmlSerializer(typeof(MyClass)); XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); ns.Add( "", "" ); MyClass c= new MyClass(); c.PropertyFromDerivedClass= "Hallo"; sw = new System.IO.StringWriter(); s1.Serialize(new XTWND(sw), c, ns); .... /// XmlTextWriterFormattedNoDeclaration /// helper class : eliminates the XML Documentation at the /// start of a XML doc. /// XTWFND = XmlTextWriterFormattedNoDeclaration public class XTWFND : System.Xml.XmlTextWriter { public XTWFND(System.IO.TextWriter w) : base(w) { Formatting = System.Xml.Formatting.Indented; } public override void WriteStartDocument() { } }


El siguiente enlace lo llevará a una publicación donde alguien tiene un método para suprimir las instrucciones de procesamiento al usar un XmlWriter y entrar en un estado ''Elemento'' en lugar de un estado ''Comenzar''. Esto hace que las instrucciones de procesamiento no se escriban.

Suprimir instrucción de procesamiento

Si pasa un XmlWriter al serializador, solo emitirá una instrucción de procesamiento si el estado del XmlWriter es ''Start'' (es decir, aún no se ha escrito nada).

// Assume we have a type named ''MyType'' and a variable of this type named ''myObject'' System.Text.StringBuilder output = new System.Text.StringBuilder(); System.IO.StringWriter internalWriter = new System.IO.StringWriter(output); System.Xml.XmlWriter writer = new System.Xml.XmlTextWriter(internalWriter); System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(typeof(MyType)); writer.WriteStartElement("MyContainingElement"); serializer.Serialize(writer, myObject); writer.WriteEndElement();

En este caso, el escritor estará en un estado de ''Elemento'' (dentro de un elemento) por lo que no se escribirá ninguna instrucción de procesamiento. Una vez que termine de escribir el XML, puede extraer el texto de la secuencia subyacente y procesarlo en el contenido de su corazón.