2011-02-08 20 views
10
using System; 

public class clsPerson 
{ 
    public string FirstName; 
    public string MI; 
    public string LastName; 
} 

class class1 
{ 
    static void Main(string[] args) 
    { 
     clsPerson p=new clsPerson(); 
     p.FirstName = "Jeff"; 
     p.MI = "A"; 
     p.LastName = "Price"; 
     System.Xml.Serialization.XmlSerializer x = new System.Xml.Serialization.XmlSerializer(p.GetType()); 
     x.Serialize(Console.Out, p); 
     Console.WriteLine(); 
     Console.ReadLine(); 
    } 
} 

tomado de http://support.microsoft.com/kb/815813serialización XML, codificación

1)

System.Xml.Serialization.XmlSerializer x = new System.Xml.Serialization.XmlSerializer(p.GetType()); 

¿Qué hace esta línea? ¿Qué es GetType()?

2) ¿Cómo puedo obtener la codificación de

<?xml version="1.0" encoding="utf-8"?> 
< clsPerson xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 

en lugar de

<?xml version="1.0" encoding="IBM437"?> 
<clsPerson xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3 
.org/2001/XMLSchema"> 

o no incluir el tipo de codificación en absoluto?

Respuesta

10

1) La función GetType() devuelve un objeto Type que representa el tipo de su objeto, en este caso la clase clsPerson. También puede usar typeof(clsPerson) y obtener el mismo resultado. Esa línea crea un objeto XmlSerializer para su clase particular.

2) Si desea cambiar la codificación, creo que hay una anulación de la función Serialize() que le permite especificar eso. Ver MSDN para más detalles. Puede que tenga que crear un objeto XmlWriter utilizarlo sin embargo, los detalles para que también están en MSDN:

XmlWriter writer = XmlWriter.Create(Console.Out, settings); 

También puede establecer la codificación en el XmlWriter, los XmlWriterSettings objeto tiene una propiedad de codificación.

2

1) Esto crea un XmlSerializer para la clase clsPerson.

2) la codificación es IBM437 porque esa es la forma de la secuencia Console.Out.

PD: la notación húngara no se prefiere en C#; solo nombra a tu clase Persona.

51

Si pasa el serializador un XmlWriter, puede controlar algunos parámetros como la codificación, ya sea para omitir la declaración (por ejemplo, para un fragmento), etc.

Esto no pretende ser una guía definitiva, sino una alternativa para que pueda ver lo que está pasando, y algo que no solo va a consolar primero.

Tenga en cuenta también que si crea su XmlWriter con un StringBuilder en lugar de un MemoryStream, su xml ignorará su codificación y se codificará como utf-16. Consulte la publicación del blog writing xml with utf8 encoding para obtener más información.

XmlWriterSettings xmlWriterSettings = new XmlWriterSettings 
{ 
    Indent = true, 
    OmitXmlDeclaration = false, 
    Encoding = Encoding.UTF8 
}; 

using (MemoryStream memoryStream = new MemoryStream()) 
using (XmlWriter xmlWriter = XmlWriter.Create(memoryStream, xmlWriterSettings)) 
{ 
    var x = new System.Xml.Serialization.XmlSerializer(p.GetType()); 
    x.Serialize(xmlWriter, p); 

    // we just output back to the console for this demo. 
    memoryStream.Position = 0; // rewind the stream before reading back. 
    using(StreamReader sr = new StreamReader(memoryStream)) 
    { 
     Console.WriteLine(sr.ReadToEnd()); 
    } // note memory stream disposed by StreamReaders Dispose() 
} 
+0

+1 para la entrada del blog, me ayudó –

+5

En este ejemplo, el StreamReader cerrará el MemoryStream. El uso de Dispose of the XmlWriter intentará acceder a la transmisión cerrada. Vea http://stackoverflow.com/a/8833066/28594 para formas alternativas de estructurar los usos. – Liam

+1

+1 para la referencia a StringBuilder y utf-16 – flocki

1

Tomé la solución ofrecida por @ Robert-Paulson aquí por una cosa similar que estaba tratando de hacer y obtener la cadena de un XmlSchema. Por defecto, volvería como utf-16. Sin embargo, como se mencionó, la solución aquí sufre un error de lectura de secuencia cerrada. Así que aprovecho la libertad de publicar el refactor como un método de extensión con la tweek mencionada por @Liam para mover el bloque de uso.

public static string ToXmlString(this XmlSchema xsd) 
    { 
     var xmlWriterSettings = new XmlWriterSettings 
     { 
      Indent = true, 
      OmitXmlDeclaration = false, 
      Encoding = Encoding.UTF8 
     }; 

     using (var memoryStream = new MemoryStream()) 
     { 
      using (var xmlWriter = XmlWriter.Create(memoryStream, xmlWriterSettings)) 
      { 
       xsd.Write(xmlWriter); 
      } 

      memoryStream.Position = 0; 
      using (var sr = new StreamReader(memoryStream)) 
      { 
       return sr.ReadToEnd(); 
      } 
     } 
    }