簡體   English   中英

如何反序列化具有多個 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>

我為此創建了一些 map 類:

[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

我發現的唯一屬性似乎是 map 到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
    {
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM