反序列化此XML字符串的正确方法是什么?

时间:2017-09-22 07:36:19

标签: c# xml deserialization

我将显示在主页上的项目存储为XML字符串(在设置中)。

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

有些项目代表工厂PlantHomePageItem,其他项目代表管理工具AdminHomePageItem。两者都继承了相同的基类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 { }

当我尝试反序列化它时,我没有运行时错误,只是一个空对象......

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

返回

0

提供整个事物的.NET小提琴:https://dotnetfiddle.net/f51b0K

1 个答案:

答案 0 :(得分:4)

将您的TestSerialization课程更改为此...

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

Your modified example...