Search code examples
c#wpfdeserializationindexoutofrangeexception

Xml Deserialization does not create any Elements for XmlArray


I am working on a project using WPF and want to Deserialize a XML File with structure like this:

<SoftwareUpdate>
  <Einträge>
    <Eintrag>
      <Device></Device>
      <language1>
        <Information>
      </language1>
      <language2>
        <Information>
      </language2>
    </Eintrag>
    <Eintrag>
      <Device></Device>
      <language1>
        <Information>
      </language1>
      <language2>
        <Information>
      </language2>
    </Eintrag>
    <Eintrag>
      <Device></Device>
      <language1>
        <Information>
      </language1>
      <language2>
        <Information>
      </language2>
    </Eintrag>    
    <Eintrag>
      <Device></Device>
      <language1>
        <Information>
      </language1>
      <language2>
        <Information>
      </language2>
    </Eintrag>
  <Einträge>
<SoftwareUpdate>

these are my classes

public class SoftwareUpdate
{
    [XmlElement("Einträge")]
    public Einträge einträge { get; set; }
}

public class Einträge
{
    [XmlArray("Eintrag")]
    [XmlArrayItem("Eintrage", typeof(Eintrag))]
    public Eintrag[] eintrag { get; set; }
}

public class Eintrag
{
    public String Device { get; set; }
    public Language language1 { get; set; }
    public Language language2 { get; set; }
}

public class Language
{
    public String Information { get; set; }
}

and this is my Code

SoftwareUpdate softwareUpdate = null;
string path = @"C:\XML-File\TestFile.xml";
XmlSerializer serializer = new XmlSerializer(typeof(SoftwareUpdate));

StreamReader reader = new StreamReader(path);
softwareUpdate = (SoftwareUpdate)serializer.Deserialize(reader);
Trace.WriteLine(softwareUpdate.einträge.Eintrag[1].DeviceType);

reader.Close();

But i get IndexOutOfRangeException at

Trace.WriteLine(softwareUpdate.einträge.Eintrag[1].DeviceType);

But the Array Eintrag should have four elements. So the problem probably lies somewhere in the code or in the classes but I can't see it.


Solution

  • The data model classes where wrong.

    public class SoftwareUpdate
    {
        [XmlArray("Einträge")]
        [XmlArrayItem("Eintrag", typeof(Eintrag))]
        public Eintrag[] Eintrag { get; set; }
    }
    
    
    public class Eintrag
    {
        public String Device { get; set; }
        public Language language1 { get; set; }
        public Language language2 { get; set; }
    }
    
    public class Language
    {
        public String Information { get; set; }
    }