2012-03-15 89 views
4

我想分析一些trx文件(webTestResults)来输出合成的Excel文件。TestRunType的序列化抛出异常

首先,我将trx xsd模式(Visual Studio目录中的vstst.xsd)生成一堆C#类。

然后,我尝试基于TestRunType的类型(从模式生成)实例化XmlSerializer。

XmlSerializer xmlSer = new XmlSerializer(typeof(TestRunType)); 

XmlSerializer的实例引发了一个异常:

System.InvalidOperationException: There was an error reflecting type 'TestRunType'. ---> System.InvalidOperationException: There was an error reflecting property 'Items'. ---> System.InvalidOperationException: There was an error reflecting type 'TestRunTypeTestDefinitions'. ---> System.InvalidOperationException: There was an error reflecting property 'Items'. ---> System.InvalidOperationException: There was an error reflecting type 'OrderedTestType'. ---> System.InvalidOperationException: There was an error reflecting type 'CodedWebTestElementType'. ---> System.InvalidOperationException: There was an error reflecting property 'Items'. ---> System.InvalidOperationException: Member 'CodedWebTestElementType.Items' hides inherited member 'BaseTestType.Items', but has different custom attributes. 
    at System.Xml.Serialization.StructMapping.FindDeclaringMapping(MemberMapping member, StructMapping& declaringMapping, String parent) 
    at System.Xml.Serialization.XmlReflectionImporter.InitializeStructMembers(StructMapping mapping, StructModel model, Boolean openModel, String typeName, RecursionLimiter limiter) 

什么是自定义属性? 只是BaseTestType的开头:

public abstract partial class BaseTestType { 

    private object[] itemsField; 

    private bool enabledField; 

    private string idField; 

    private string nameField; 

    private bool isGroupableField; 

    private int priorityField; 

    private string namedCategoryField; 

    private string storageField; 

    public BaseTestType() { 
     this.enabledField = true; 
     this.isGroupableField = true; 
     this.priorityField = 2147483647; 
     this.namedCategoryField = ""; 
    } 

    /// <remarks/> 
    [System.Xml.Serialization.XmlElementAttribute("Agent", typeof(BaseTestTypeAgent))] 
    [System.Xml.Serialization.XmlElementAttribute("Css", typeof(BaseTestTypeCss))] 
    [System.Xml.Serialization.XmlElementAttribute("DeploymentItems", typeof(BaseTestTypeDeploymentItems))] 
    [System.Xml.Serialization.XmlElementAttribute("Description", typeof(object))] 
    [System.Xml.Serialization.XmlElementAttribute("Execution", typeof(BaseTestTypeExecution))] 
    [System.Xml.Serialization.XmlElementAttribute("Owners", typeof(BaseTestTypeOwners))] 
    [System.Xml.Serialization.XmlElementAttribute("Properties", typeof(BaseTestTypeProperties))] 
    [System.Xml.Serialization.XmlElementAttribute("TcmInformation", typeof(TcmInformationType))] 
    [System.Xml.Serialization.XmlElementAttribute("TestCategory", typeof(BaseTestTypeTestCategory))] 
    [System.Xml.Serialization.XmlElementAttribute("WorkItemIDs", typeof(WorkItemIDsType))] 
    public object[] Items { 
     get { 
      return this.itemsField; 
     } 
     set { 
      this.itemsField = value; 
     } 
    } 

而且CodedWebTestElementType:

/// <remarks/> 
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.1")] 
[System.SerializableAttribute()] 
[System.Diagnostics.DebuggerStepThroughAttribute()] 
[System.ComponentModel.DesignerCategoryAttribute("code")] 
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://microsoft.com/schemas/VisualStudio/TeamTest/2010")] 
public partial class CodedWebTestElementType : BaseTestType { 

    private object[] itemsField; 

    /// <remarks/> 
    [System.Xml.Serialization.XmlElementAttribute("IncludedWebTests", typeof(CodedWebTestElementTypeIncludedWebTests))] 
    [System.Xml.Serialization.XmlElementAttribute("WebTestClass", typeof(CodedWebTestElementTypeWebTestClass))] 
    public object[] Items { 
     get { 
      return this.itemsField; 
     } 
     set { 
      this.itemsField = value; 
     } 
    } 
} 

有人能向我解释的问题是什么?

感谢...

回答

8

的解决方案是从派生类(CodedWebTestElementTypeGenericTestType)删除项目属性,也给移动序列化属性的基类,以免错过万一你值有一个编码的网络测试或通用测试。

IOW,解决方案如下。

首先,从CodedWebTestElementType类型删除Items财产

/// <remarks/> 
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.1")] 
[System.SerializableAttribute()] 
[System.Diagnostics.DebuggerStepThroughAttribute()] 
[System.ComponentModel.DesignerCategoryAttribute("code")] 
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://microsoft.com/schemas/VisualStudio/TeamTest/2010")] 
public partial class CodedWebTestElementType : BaseTestType { 
} 

然后移动它的两位XmlElementAttribute属性的BaseTestType基类(见最后两个):

/// <remarks/> 
[System.Xml.Serialization.XmlElementAttribute("Agent", typeof(BaseTestTypeAgent))] 
[System.Xml.Serialization.XmlElementAttribute("Css", typeof(BaseTestTypeCss))] 
[System.Xml.Serialization.XmlElementAttribute("DeploymentItems", typeof(BaseTestTypeDeploymentItems))] 
[System.Xml.Serialization.XmlElementAttribute("Description", typeof(object))] 
[System.Xml.Serialization.XmlElementAttribute("Execution", typeof(BaseTestTypeExecution))] 
[System.Xml.Serialization.XmlElementAttribute("Owners", typeof(BaseTestTypeOwners))] 
[System.Xml.Serialization.XmlElementAttribute("Properties", typeof(BaseTestTypeProperties))] 
[System.Xml.Serialization.XmlElementAttribute("TcmInformation", typeof(TcmInformationType))] 
[System.Xml.Serialization.XmlElementAttribute("TestCategory", typeof(BaseTestTypeTestCategory))] 
[System.Xml.Serialization.XmlElementAttribute("WorkItemIDs", typeof(WorkItemIDsType))] 
[System.Xml.Serialization.XmlElementAttribute("IncludedWebTests", typeof(CodedWebTestElementTypeIncludedWebTests))] 
[System.Xml.Serialization.XmlElementAttribute("WebTestClass", typeof(CodedWebTestElementTypeWebTestClass))] 
public object[] Items 
{ 
    get { 
     return this.itemsField; 
    } 
    set { 
     this.itemsField = value; 
    } 
} 

之后,做对于GenericTestType类同样的事情。

这样你就不会丢失情况下的信息你IncludedWebTestsWebTestClass命令SummaryXmlFile1天节点。