微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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…

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。