Frage

fand ich ein Problem mit der XML-Serialisierung von C #. Der Ausgang des Serialisierers inkonsistent zwischen normaler Win32 und WinCE (aber überraschenderweise hat den WinCE IMO korrektere Ausgang). Win32 einfach ignoriert die Class2 XmlRoot("c2") Attribut.

Kennt jemand eine Möglichkeit, wie die WinCE wie Ausgang auf Win32 zu bekommen (weil ich die Klassennamen der Serialisierung Klasse nicht über die XML-Tags will).

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

Erwartete XML (WinCE erzeugt diese):

<?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>
War es hilfreich?

Lösung

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;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top