2008-09-24 24 views
22

Encontré un problema con la serialización XML de C#. La salida del serializador es inconsistente entre Win32 y WinCE normales (pero, sorprendentemente, WinCE tiene la salida del corrector IMO). Win32 simplemente ignora el atributo Class2 XmlRoot("c2").Serialización de XML de la matriz C#

¿Alguien sabe una manera de cómo obtener la salida WinCE como en Win32 (porque no quiero que las etiquetas XML tengan el nombre de clase de la clase de serialización).

Código

prueba:

using System; 
using System.Xml.Serialization; 
using System.IO; 

namespace ConsoleTest 
{ 
    [Serializable] 
    [XmlRoot("c1")] 
    public class Class1 
    { 
     [XmlArray("items")] 
     public Class2[] Items; 
    } 

    [Serializable] 
    [XmlRoot("c2")] 
    public class Class2 
    { 
     [XmlAttribute("name")] 
     public string Name; 
    } 

    class SerTest 
    { 
     public void Execute() 
     { 
      XmlSerializer ser = new XmlSerializer(typeof (Class1)); 

      Class1 test = new Class1 {Items = new [] {new Class2 {Name = "Some Name"}, new Class2 {Name = "Another Name"}}}; 

      using (TextWriter writer = new StreamWriter("test.xml")) 
      { 
       ser.Serialize(writer, test); 
      } 
     } 
    } 
} 

XML esperado (mueca de dolor genera este):

<?xml version="1.0" encoding="utf-8"?> 
<c1 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <items> 
    <c2 name="Some Name" /> 
    <c2 name="Another Name" /> 
    </items> 
</c1> 

Win32 XML (parece ser la versión incorrecta):

<?xml version="1.0" encoding="utf-8"?> 
<c1 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <items> 
    <Class2 name="Some Name" /> 
    <Class2 name="Another Name" /> 
    </items> 
</c1> 

Respuesta

35

Intenta [XmlArrayItem ("c2")]

[XmlRoot("c1")] 
public class Class1 
{ 
    [XmlArray("items")] 
    [XmlArrayItem("c2")] 
    public Class2[] Items; 
} 

o [XmlType ("c2")]

[XmlType("c2")] 
public class Class2 
{ 
    [XmlAttribute("name")] 
    public string Name; 
}