C# 使用可能不同的元素但相同的类反序列化XML集合

C# 使用可能不同的元素但相同的类反序列化XML集合,c#,xml,serialization,C#,Xml,Serialization,我试图为失败的测试编写Nunit report analyzer/collector之类的东西,但在尝试反序列化测试报告时遇到了问题 Nunit报告具有以下结构: <test-results ... > <test-suite> <results> <test-suite> or <test-case> bunch of elements <failu

我试图为失败的测试编写Nunit report analyzer/collector之类的东西,但在尝试反序列化测试报告时遇到了问题

Nunit报告具有以下结构:

<test-results ... >
    <test-suite>
        <results>
            <test-suite> or <test-case> bunch of elements
                <failure> // optional
        </results>
    </test-suite>
</test-results>
和Results类假设有一个测试套件或测试用例列表:

[Serializable()]
    public class Results
    {
        [XmlArray("results")]
        [XmlArrayItem("test-case", Type = typeof(TestCase))]
        [XmlArrayItem("test-suite", Type = typeof(TestSuite))]
        public List<Result> Result { get; set; }
    }
[Serializable()]
公开课成绩
{
[XmlArray(“结果”)]
[XmlArrayItem(“测试用例”,Type=typeof(测试用例))]
[XmlArrayItem(“测试套件”,Type=typeof(测试套件))]
公共列表结果{get;set;}
}
这里TestCase和TestSuite是Result的空子类,因为arrtibutes和元素是相同的。集合中没有以这种方式序列化的项。如果我试图为每个项目指定多个没有专用类型的ArraUIItem-s,pardser会认为它不匹配


如何使用不同但相关的元素来序列化集合?

我相信下面的结构会序列化到您想要的模式(删除了非基本属性):

公共类测试结果
{
...
[XmlElement(“结果”)]
公共TestResultCollection结果{get;set;}
...
}
公共类TestCase:TestResult
{
}
公共类TestSuite:TestResult
{
[XmlAttribute(“类型”)]
公共字符串类型{get;set;}
}
[XmlRoot(“测试结果”)]
公共类TestResultCollection
{
[xmlement(“测试用例”,Type=typeof(TestCase))]
[XmlElement(“测试套件”,Type=typeof(TestSuite))]
公共列表结果{get;set;}
}
下面是我如何使用它来序列化/反序列化:

var serializer = new XmlSerializer(typeof (TestResultsCollection));

var testResultsCollection = new TestResultsCollection();
testResultsCollection.Items = new List<TestResult>
{
    new TestSuite
    {
        Results = new TestResultsCollection
        {
            Items = new List<TestResult> {new TestCase(), new TestSuite()}
        }
    },
    new TestCase
    {
        Results = new TestResultsCollection
        {
            Items = new List<TestResult> {new TestCase(), new TestSuite()}
        }
    }
};

using (var fileStream = File.CreateText("output.xml"))
{
    serializer.Serialize(fileStream, testResultsCollection);
}

using (var fileStream = File.OpenText("output.xml"))
{
    var deserialized = (TestResultsCollection)serializer.Deserialize(fileStream);
}
var serializer=新的XmlSerializer(typeof(TestResultCollection));
var testResultsCollection=新的testResultsCollection();
TestResultCollection.Items=新列表
{
新测试套件
{
结果=新的TestResultCollection
{
Items=新列表{new TestCase(),new TestSuite()}
}
},
新测试用例
{
结果=新的TestResultCollection
{
Items=新列表{new TestCase(),new TestSuite()}
}
}
};
使用(var fileStream=File.CreateText(“output.xml”))
{
serializer.Serialize(文件流、TestResultCollection);
}
使用(var fileStream=File.OpenText(“output.xml”))
{
var反序列化=(TestResultCollection)序列化程序;
}

我相信下面的结构序列化为您想要的模式(删除了非基本属性):

公共类测试结果
{
...
[XmlElement(“结果”)]
公共TestResultCollection结果{get;set;}
...
}
公共类TestCase:TestResult
{
}
公共类TestSuite:TestResult
{
[XmlAttribute(“类型”)]
公共字符串类型{get;set;}
}
[XmlRoot(“测试结果”)]
公共类TestResultCollection
{
[xmlement(“测试用例”,Type=typeof(TestCase))]
[XmlElement(“测试套件”,Type=typeof(TestSuite))]
公共列表结果{get;set;}
}
下面是我如何使用它来序列化/反序列化:

var serializer = new XmlSerializer(typeof (TestResultsCollection));

var testResultsCollection = new TestResultsCollection();
testResultsCollection.Items = new List<TestResult>
{
    new TestSuite
    {
        Results = new TestResultsCollection
        {
            Items = new List<TestResult> {new TestCase(), new TestSuite()}
        }
    },
    new TestCase
    {
        Results = new TestResultsCollection
        {
            Items = new List<TestResult> {new TestCase(), new TestSuite()}
        }
    }
};

using (var fileStream = File.CreateText("output.xml"))
{
    serializer.Serialize(fileStream, testResultsCollection);
}

using (var fileStream = File.OpenText("output.xml"))
{
    var deserialized = (TestResultsCollection)serializer.Deserialize(fileStream);
}
var serializer=新的XmlSerializer(typeof(TestResultCollection));
var testResultsCollection=新的testResultsCollection();
TestResultCollection.Items=新列表
{
新测试套件
{
结果=新的TestResultCollection
{
Items=新列表{new TestCase(),new TestSuite()}
}
},
新测试用例
{
结果=新的TestResultCollection
{
Items=新列表{new TestCase(),new TestSuite()}
}
}
};
使用(var fileStream=File.CreateText(“output.xml”))
{
serializer.Serialize(文件流、TestResultCollection);
}
使用(var fileStream=File.OpenText(“output.xml”))
{
var反序列化=(TestResultCollection)序列化程序;
}
var serializer = new XmlSerializer(typeof (TestResultsCollection));

var testResultsCollection = new TestResultsCollection();
testResultsCollection.Items = new List<TestResult>
{
    new TestSuite
    {
        Results = new TestResultsCollection
        {
            Items = new List<TestResult> {new TestCase(), new TestSuite()}
        }
    },
    new TestCase
    {
        Results = new TestResultsCollection
        {
            Items = new List<TestResult> {new TestCase(), new TestSuite()}
        }
    }
};

using (var fileStream = File.CreateText("output.xml"))
{
    serializer.Serialize(fileStream, testResultsCollection);
}

using (var fileStream = File.OpenText("output.xml"))
{
    var deserialized = (TestResultsCollection)serializer.Deserialize(fileStream);
}