如何反序列化具有多个 xsi:type 的列表

How to de-serialise a list with multiple xsi:type

我在 System.Xml.Serialization 中使用 XmlSerializer

我有一个由 xsi:type 分隔的列表(或者实际上是两个列表)。

<?xml version="1.0" encoding="utf-8"?>
<ButikerOmbud xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <Info>
        <Meddelande>blah blah</Meddelande>
    </Info>
    <ButikOmbud xsi:type="StoreAssortmentViewModel">
        <Typ>Butik</Typ><Nr>2515</Nr>
    </ButikOmbud>
    <ButikOmbud xsi:type="StoreAssortmentViewModel">
        <Typ>Butik</Typ><Nr>2516</Nr>
    </ButikOmbud>
    <ButikOmbud xsi:type="AgentAssortmentViewModel">
        <Typ>Ombud</Typ><Nr>011703-91A</Nr>
    </ButikOmbud>
    <ButikOmbud xsi:type="AgentAssortmentViewModel">
        <Typ>Ombud</Typ><Nr>011703-92B</Nr>
    </ButikOmbud>
</ButikerOmbud>

我创建了一些 类 映射到这个:

[XmlRoot(ElementName = "ButikerOmbud")]
public class ButiksCollection
{
    [XmlElement(ElementName = "Info")]
    public Info Info { get; set; }

    [XmlElement(ElementName = "ButikOmbud")]
    public List<Butik> Butiker { get; set; }
}

[XmlRoot(ElementName = "ButikOmbud")]
[XmlType(TypeName = "StoreAssortmentViewModel")]
public class Butik
{
    [XmlElement(ElementName = "Typ")]
    public string Typ { get; set; }

    [XmlElement(ElementName = "Nr")]
    public int Nr { get; set; }

}

然后我会这样做

(ButiksCollection)(new XmlSerializer(typeof(ButiksCollection)).Deserialize(memoryStream));

如果只有 StoreAssortmentViewModel 存在,这应该可以工作。但是假设同一个节点下存在AgentAssortmentViewModel。我不确定我应该如何反序列化这个。我假设 ButiksCollection.

上应该有另一个集合 List<Butik> Agents

我发现似乎映射到 xsi:type 的唯一属性应用于 类,我认为这不是我想要的

如何安排和归因于我的 类 以便反序列化?

以下是 dotnetfiddle 上的所有内容:https://dotnetfiddle.net/vmT4SK

尝试以下操作:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Serialization;

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XmlReader reader = XmlReader.Create(FILENAME);
            XmlSerializer serializer = new XmlSerializer(typeof(ButiksCollection));
            ButiksCollection butik = (ButiksCollection)serializer.Deserialize(reader);
            List<StoreAssortmentViewModel> storeAssortments = butik.Butiker.Where(x => x.GetType() == typeof(StoreAssortmentViewModel)).Select(x => (StoreAssortmentViewModel)x).ToList();
            List<AgentAssortmentViewModel> agentAssortments = butik.Butiker.Where(x => x.GetType() == typeof(AgentAssortmentViewModel)).Select(x => (AgentAssortmentViewModel)x).ToList();

        }
    }
    [XmlRoot(ElementName = "ButikerOmbud")]
    public class ButiksCollection
    {
        [XmlElement(ElementName = "Info")]
        public Info Info { get; set; }

        [XmlElement(ElementName = "ButikOmbud")]
        public List<Butik> Butiker { get; set; }
    }

    [XmlRoot(ElementName = "ButikOmbud")]
    [XmlInclude(typeof(StoreAssortmentViewModel))]
    [XmlInclude(typeof(AgentAssortmentViewModel))]
    public class Butik
    {   
        [XmlElement(ElementName = "Typ")]
        public string Typ { get; set; }
        [XmlElement(ElementName = "Nr")]
        public string Nr { get; set; }

    }
    public class Info
    {
        public string Meddelande { get; set; }
    }
    public class StoreAssortmentViewModel : Butik
    {
    }
    public class AgentAssortmentViewModel : Butik
    {
    }
}