XMLSerialize导致未知类型错误的基类型列表

时间:2018-04-02 20:40:04

标签: c# xmlserializer generic-collections

我正在尝试序列化一个可以容纳子类对象的List。我需要它缺少任何父标记,因此List上的XMLElement帮助了它。我的问题是List的反映不知道子标签是什么。

我发现当我将[XmlRoot]标记添加到代表我的根元素的类时,我的问题就出现了。

[XmlRoot("EFilingBatchXML", Namespace = "www.fincen.gov/base", IsNullable = false)] public class XmlRoot

在此之前List工作,我可以使用[XmlInclude]作为子类,或者在创建XmlSerializer时包含Type []。它有一个小问题,包括属性:

  

的xsi:type = “孩子”

     

的xsi:type = “成人”

所以看起来Root标签会导致我的问题,但我也需要知道如何排除这些属性。

例)

[XMLElement("Person")]
public List<Person> PersonList { get; set; }
.
.
PersonList = new List<Person>() {
    new Child(), new Adult()
};

我需要它格式化

<root>
...
    <Person>
        <Person elements>
        <Child elements>
    </Person>
    <Person>
        <Person elements>
        <Adult elements>
    </Person>
...
</root>

我总是收到错误

  

没想到孩子。使用XmlInclude或SoapInclude属性指定静态未知的类型。

任何帮助都会受到赞赏,因为我的想法已经不多了,并且不知道为什么Type []解决方案对此不起作用。

1 个答案:

答案 0 :(得分:0)

请尝试以下操作:

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

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            Root root = new Root() {
                PersonList = new List<Person>() {
                    new Person() {
                        person = "Person1",
                        child = "Child1"
                    },
                    new Person() {
                        person = "Person2",
                        adult = "Adult2"
                    }
                }
            };

            XmlSerializer serializer = new XmlSerializer(typeof(Root));
            XmlWriterSettings settings = new XmlWriterSettings();
            settings.Indent = true;
            XmlWriter writer = XmlWriter.Create(FILENAME,settings);
            serializer.Serialize(writer, root);
        }
    }
    public class Root
    {
        [XmlElement("Person")]
        public List<Person> PersonList { get; set; }

    }
    public class Person
    {
        [XmlElement("Person")]
        public string person { get; set; }

        [XmlElement("Child")]
        public string child { get; set; }

        [XmlElement("Adult")]
        public string adult { get; set; }
    }
}