What is the correct way to deserialize this XML string?

Viewed 116

I store the items displayed on my homepage as an XML string (in the settings).

<?xml version=""1.0""?>
<HomePageItemList>
    <PlantHomePageItem>
        <Name>Plant1</Name>
    </PlantHomePageItem>
    <PlantHomePageItem>
        <Name>Plant2</Name>
    </PlantHomePageItem>
    <AdminHomePageItem>
        <Name>Admin1</Name>
    </AdminHomePageItem>
</HomePageItemList>

Some items represent a plant PlantHomePageItem, others an admin tool AdminHomePageItem. Both inherit the same base class HomePageItem

[XmlRoot("HomePageItemList")]
public class TestSerialization
{
    [XmlArray("HomePageItemList")]
    [XmlArrayItem("PlantHomePageItem", Type = typeof(PlantHomePageItem))]
    [XmlArrayItem("AdminHomePageItem", Type = typeof(AdminHomePageItem))]
    public List<HomePageItem> HomePageItemList { get; set; }
}

[XmlInclude(typeof(PlantHomePageItem))]
[XmlInclude(typeof(AdminHomePageItem))]
public class HomePageItem
{
    [XmlElement("Name")]
    public string Name { get; set; }
}

public class PlantHomePageItem : HomePageItem { }
public class AdminHomePageItem : HomePageItem { }

When I try an deserialize it, I have no runtime error, just an empty object...

MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(XML));
XmlSerializer xs = new XmlSerializer(typeof(TestSerialization));
TestSerialization obj = (TestSerialization)xs.Deserialize(ms);

Console.WriteLine(obj.HomePageItemList.Count);

foreach (var item in obj.HomePageItemList)
{
    Console.WriteLine("{0}: {1}", item.GetType().Name, item.Name);
}

returns

0

A .NET Fiddle with the entire thing is available: https://dotnetfiddle.net/f51b0K

1 Answers

Change your TestSerialization class to this...

[XmlRoot("HomePageItemList")]
public class TestSerialization
{
   [XmlElement("PlantHomePageItem", Type = typeof(PlantHomePageItem))]
   [XmlElement("AdminHomePageItem", Type = typeof(AdminHomePageItem))]
   public List<HomePageItem> HomePageItemList { get; set; }
}

Your modified example...

Related