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

我将显示在主页上的项目存储为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

解决方法:

将您的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…

相关文章

php输出xml格式字符串
J2ME Mobile 3D入门教程系列文章之一
XML轻松学习手册
XML入门的常见问题(一)
XML入门的常见问题(三)
XML轻松学习手册(2)XML概念