这个问题的正确答案是什么,用于反序列化这个XML字符串?

3

我将首页显示的项目作为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 Fiddle:https://dotnetfiddle.net/f51b0K

1个回答

4

将你的TestSerialization类更改为以下内容...

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

这是您修改后的范例...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接