C# 使用可能不同的元素但相同的类反序列化XML集合
我试图为失败的测试编写Nunit report analyzer/collector之类的东西,但在尝试反序列化测试报告时遇到了问题 Nunit报告具有以下结构: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
<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);
}