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

问题描述 投票:0回答:1

我正在使用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。我不确定该如何反序列化。我假设List<Butik> Agents上应该有另一个集合ButiksCollection

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

我如何安排和分配我的课程,这样可以取消序列化?

c# xml xmlserializer
1个回答
0
投票

尝试以下内容:

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);
        }
    }
    [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
    {
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.