Search code examples
c#xmlserialization.net-4.6.2

XML Serialization Not populating the array


I am trying to serialize the below XML. But the section "Keys" are not getting populated and its coming as null in the serialized object.

<?xml version="1.0"?>
<Golden>
<SecType>
    <ID>New</ID>
    <Count>1</Count>
</SecType>
<Request>
    <Action>New</Action>
    <Keys>
        <Key>
            <ReferenceType>AAA</ReferenceType>
            <ReferenceValue>1111</ReferenceValue>
            <Description></Description>
        </Key>
        <Key>
            <ReferenceType>BBBB</ReferenceType>
            <ReferenceValue>22222</ReferenceValue>
            <Description></Description>
        </Key>
    </Keys>
</Request></Golden>

I am trying to create a custom class object for further use. Please see my code below.

[Serializable]
[XmlRootAttribute("Golden")]
public class Process
{
    [XmlElementAttribute("SecType")]
    public SecType secType { get; set; }
    [XmlElementAttribute("Request")]
    public Request request { get; set; }
}

[Serializable]
[XmlRootAttribute("SecType")]
public class SecType 
{
    [XmlElementAttribute("ID")]
    public string ID { get; set; }
    [XmlElementAttribute("Count")]
    public int Count { get; set; }
}

[Serializable]
[XmlRootAttribute("Request")]
public class Request
{
    [XmlElementAttribute("Action")]
    public string Action { get; set; }
    [XmlElementAttribute("Keys")]
    public Keys keys { get; set; }
}

[Serializable()]
[XmlRootAttribute("Keys")]
public class Keys
{
   [XmlArray("Keys")]
    [XmlArrayItem("Key", typeof(Key))]
    public Key[] key { get; set; }
}

[Serializable]
[XmlRootAttribute("Key")]
public class Key
{
    [XmlElementAttribute("ReferenceType")]
    public string ReferenceType { get; set; }
    [XmlElementAttribute("ReferenceValue")]
    public string ReferenceValue { get; set; }
    [XmlElementAttribute("Description")]
    public string Description { get; set; }
}


    string sPath = @"C:\Test\ConsoleApp1\test.xml";
    Process proc = new Process();
    XmlSerializer serializer = new XmlSerializer(typeof(Process));
    StreamReader reader = new StreamReader(sPath);
    proc = (Process)serializer.Deserialize(reader);
    reader.Close();

I mainly referred this. But it's not working in my implementation.Thanks for you help


Solution

  • I just fixed the Key Element :

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Xml;
    using System.Xml.Serialization;
    
    namespace ConsoleApplication142
    {
        class Program
        {
            const string FILENAME = @"c:\temp\test.xml";
            static void Main(string[] args)
            {
                XmlReader reader = XmlReader.Create(FILENAME);
                XmlSerializer serializer = new XmlSerializer(typeof(Process));
                Process proc = (Process)serializer.Deserialize(reader);
            }
        }
        [Serializable]
        [XmlRootAttribute("Golden")]
        public class Process
        {
            [XmlElementAttribute("SecType")]
            public SecType secType { get; set; }
            [XmlElementAttribute("Request")]
            public Request request { get; set; }
        }
    
        [Serializable]
        [XmlRootAttribute("SecType")]
        public class SecType 
        {
            [XmlElementAttribute("ID")]
            public string ID { get; set; }
            [XmlElementAttribute("Count")]
            public int Count { get; set; }
        }
    
        [Serializable]
        [XmlRootAttribute("Request")]
        public class Request
        {
            [XmlElementAttribute("Action")]
            public string Action { get; set; }
            [XmlArray("Keys")]
            [XmlArrayItem("Key")]
            public Key[] keys { get; set; }
        }
    
        [Serializable]
        [XmlRootAttribute("Key")]
        public class Key
        {
            [XmlElementAttribute("ReferenceType")]
            public string ReferenceType { get; set; }
            [XmlElementAttribute("ReferenceValue")]
            public string ReferenceValue { get; set; }
            [XmlElementAttribute("Description")]
            public string Description { get; set; }
        }
    
    
    }