2008-09-24 14 views
22

Ich habe ein Problem mit der XML-Serialisierung von C# gefunden. Die Ausgabe des Serialisierers ist inkonsistent zwischen normalem Win32 und WinCE (aber überraschend hat WinCE den IMO-Korrektor-Ausgang). Win32 ignoriert einfach das Class2 XmlRoot("c2") Attribut.C# Array XML Serialisierung

Kennt jemand eine Möglichkeit, die WinCE-ähnliche Ausgabe auf Win32 zu erhalten (weil ich nicht möchte, dass die XML-Tags den Klassennamen der Serialisierungsklasse haben).

Testcode:

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); 
      } 
     } 
    } 
} 

Expected XML (WinCE erzeugt dies):

<?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 (scheint die falsche Version zu sein):

<?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> 

Antwort

35

Versuchen [XmlArrayItem ("c2")]

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

oder [XmlType ("C2")]

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