首页 > 解决方案 > XmlSerializer 构造函数在发送 xsd.exe 生成类型时抛出堆栈溢出异常

问题描述

我有一个定义配置模式的 xsd 文件,我使用xsd.exe生成了一个类,因此我可以使用它来加载配置 xml 文件。当我将类型传递给 的构造函数时XmlSerializer,它会引发 Stack Overflow 异常。在我寻找这方面的答案时,我发现这通常发生在类中定义了递归结构时,但这里不是这种情况(据我所知)。

<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://tempuri.org/RobotInstaller" xmlns:tns="http://tempuri.org/RobotInstaller" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<!-- Enumerations -->
<xs:simpleType name="HfEnvironments">
    <xs:restriction base="xs:string">
        <xs:enumeration value="DEV"/>
        <xs:enumeration value="QA_ST"/>
        <xs:enumeration value="PP_RT"/>
        <xs:enumeration value="PROD"/>
    </xs:restriction>
</xs:simpleType>

<xs:simpleType name="RobotTypes">
    <xs:restriction base="xs:string">
        <xs:enumeration value="ANG"/>
        <xs:enumeration value="CAP"/>
        <xs:enumeration value="ENB"/>
        <xs:enumeration value="PLM"/>
    </xs:restriction>
</xs:simpleType>

<xs:simpleType name="InstallOperations">
    <xs:restriction base="xs:string">
        <xs:enumeration value="File"/>
        <xs:enumeration value="Package"/>
        <xs:enumeration value="Query"/>
        <xs:enumeration value="Task"/>
        <xs:enumeration value="Folder"/>
    </xs:restriction>
</xs:simpleType>

<xs:simpleType name="OperationModes">
    <xs:restriction base="xs:string">
        <xs:enumeration value="Replace"/>
        <xs:enumeration value="Remove"/>
    </xs:restriction>
</xs:simpleType>

<xs:simpleType name="SuccessExpectancies">
    <xs:restriction base="xs:string">
        <xs:enumeration value="Critical"/>
        <xs:enumeration value="Important"/>
        <xs:enumeration value="Negligible"/>
    </xs:restriction>
</xs:simpleType>

<xs:simpleType name="BackupModes">
    <xs:restriction base="xs:string">
        <xs:enumeration value="Always"/>
        <xs:enumeration value="Never"/>
    </xs:restriction>
</xs:simpleType>

<xs:simpleType name="Boolean">
    <xs:restriction base="xs:string">
        <xs:enumeration value="False"/>
        <xs:enumeration value="True"/>
    </xs:restriction>
</xs:simpleType>

<xs:element name="Installation">
    <xs:complexType>

        <xs:sequence>

            <xs:element name="Directives" minOccurs="1" maxOccurs="1">
                <xs:complexType>
                    <xs:sequence>

                        <xs:element name="Directive" minOccurs="0" maxOccurs="unbounded">
                            <xs:complexType>
                                <xs:sequence minOccurs="0" maxOccurs="unbounded">

                                    <xs:element name="Operation" minOccurs="0" maxOccurs="unbounded">
                                        <xs:complexType>
                                            <xs:attribute name="Type" type="tns:InstallOperations" use="required"/>
                                            <xs:attribute name="ResourcePath" type="xs:string" use="optional"/>
                                            <xs:attribute name="DestinationPath" type="xs:anyURI" use="required"/>
                                            <xs:attribute name="Success" type="tns:SuccessExpectancies" use="required"/>
                                            <xs:attribute name="BackupMode" type="tns:BackupModes" use="optional"/>
                                            <xs:attribute name="CreateDirectory" type="tns:Boolean" use="optional"/>
                                            <xs:attribute name="Mode" type="tns:OperationModes" use="optional"/>
                                        </xs:complexType>
                                    </xs:element>

                                </xs:sequence>
                                <xs:attribute name="Name" type="xs:string" use="required"/>
                                <xs:attribute name="RobotType" type="tns:RobotTypes" use="required"/>
                                <xs:attribute name="Environment" type="tns:HfEnvironments" use="required"/>
                                <xs:attribute name="BackupRoot" type="xs:anyURI" use="required"/>
                            </xs:complexType>
                        </xs:element>

                    </xs:sequence>
                </xs:complexType>
            </xs:element>
        </xs:sequence>
    </xs:complexType>
</xs:element>

这是生成的类:

//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated by a tool.
//     Runtime Version:4.0.30319.42000
//
//     Changes to this file may cause incorrect behavior and will be lost if
//     the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

using System.Xml.Serialization;

// 
// This source code was auto-generated by xsd, Version=4.6.1055.0.
// 


/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.1055.0")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="http://tempuri.org/RobotInstaller")]
[System.Xml.Serialization.XmlRootAttribute(Namespace="http://tempuri.org/RobotInstaller", IsNullable=false)]
public partial class Installation {

    private InstallationDirective[] directivesField;

    /// <remarks/>
    [System.Xml.Serialization.XmlArrayItemAttribute("Directive", IsNullable=false)]
    public InstallationDirective[] Directives {
        get {
            return this.directivesField;
        }
        set {
            this.directivesField = value;
        }
    }
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.1055.0")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="http://tempuri.org/RobotInstaller")]
public partial class InstallationDirective {

    private InstallationDirectiveOperation[] operationField;

    private string nameField;

    private RobotTypes robotTypeField;

    private HfEnvironments environmentField;

    private string backupRootField;

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("Operation")]
    public InstallationDirectiveOperation[] Operation {
        get {
            return this.operationField;
        }
        set {
            this.operationField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string Name {
        get {
            return this.nameField;
        }
        set {
            this.nameField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public RobotTypes RobotType {
        get {
            return this.robotTypeField;
        }
        set {
            this.robotTypeField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public HfEnvironments Environment {
        get {
            return this.environmentField;
        }
        set {
            this.environmentField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute(DataType="anyURI")]
    public string BackupRoot {
        get {
            return this.backupRootField;
        }
        set {
            this.backupRootField = value;
        }
    }
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.1055.0")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="http://tempuri.org/RobotInstaller")]
public partial class InstallationDirectiveOperation {

    private InstallOperations typeField;

    private string resourcePathField;

    private string destinationPathField;

    private SuccessExpectancies successField;

    private BackupModes backupModeField;

    private bool backupModeFieldSpecified;

    private Boolean createDirectoryField;

    private bool createDirectoryFieldSpecified;

    private OperationModes modeField;

    private bool modeFieldSpecified;

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public InstallOperations Type {
        get {
            return this.typeField;
        }
        set {
            this.typeField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string ResourcePath {
        get {
            return this.resourcePathField;
        }
        set {
            this.resourcePathField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute(DataType="anyURI")]
    public string DestinationPath {
        get {
            return this.destinationPathField;
        }
        set {
            this.destinationPathField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public SuccessExpectancies Success {
        get {
            return this.successField;
        }
        set {
            this.successField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public BackupModes BackupMode {
        get {
            return this.backupModeField;
        }
        set {
            this.backupModeField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlIgnoreAttribute()]
    public bool BackupModeSpecified {
        get {
            return this.backupModeFieldSpecified;
        }
        set {
            this.backupModeFieldSpecified = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public Boolean CreateDirectory {
        get {
            return this.createDirectoryField;
        }
        set {
            this.createDirectoryField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlIgnoreAttribute()]
    public bool CreateDirectorySpecified {
        get {
            return this.createDirectoryFieldSpecified;
        }
        set {
            this.createDirectoryFieldSpecified = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public OperationModes Mode {
        get {
            return this.modeField;
        }
        set {
            this.modeField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlIgnoreAttribute()]
    public bool ModeSpecified {
        get {
            return this.modeFieldSpecified;
        }
        set {
            this.modeFieldSpecified = value;
        }
    }
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.1055.0")]
[System.SerializableAttribute()]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://tempuri.org/RobotInstaller")]
public enum InstallOperations {

    /// <remarks/>
    File,

    /// <remarks/>
    Package,

    /// <remarks/>
    Task,

    /// <remarks/>
    Folder,
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.1055.0")]
[System.SerializableAttribute()]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://tempuri.org/RobotInstaller")]
public enum SuccessExpectancies {

    /// <remarks/>
    Critical,

    /// <remarks/>
    Important,

    /// <remarks/>
    Negligible,
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.1055.0")]
[System.SerializableAttribute()]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://tempuri.org/RobotInstaller")]
public enum BackupModes {

    /// <remarks/>
    Always,

    /// <remarks/>
    Never,
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.1055.0")]
[System.SerializableAttribute()]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://tempuri.org/RobotInstaller")]
public enum Boolean {

    /// <remarks/>
    False,

    /// <remarks/>
    True,
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.1055.0")]
[System.SerializableAttribute()]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://tempuri.org/RobotInstaller")]
public enum OperationModes {

    /// <remarks/>
    Replace,

    /// <remarks/>
    Remove,
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.1055.0")]
[System.SerializableAttribute()]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://tempuri.org/RobotInstaller")]
public enum RobotTypes {

    /// <remarks/>
    ANG,

    /// <remarks/>
    CAP,

    /// <remarks/>
    ENB,

    /// <remarks/>
    PLM,
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.1055.0")]
[System.SerializableAttribute()]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://tempuri.org/RobotInstaller")]
public enum HfEnvironments {

    /// <remarks/>
    DEV,

    /// <remarks/>
    QA_ST,

    /// <remarks/>
    PP_RT,

    /// <remarks/>
    PROD,
}

这是引发异常的代码:

private Installation LoadInstallationDefinition(string resourcePath)
        {
            if (string.IsNullOrWhiteSpace(resourcePath)) { throw new ArgumentException("The value cannot be null or white space.", nameof(resourcePath)); }

            Installation result = null;

            using (var installationFile = LoadEmbeddedFile(resourcePath))
            {
                try
                {
                    var serializer = new XmlSerializer(typeof(Installation));
                    result = (Installation)serializer.Deserialize(installationFile);
                }
                catch (Exception exception)
                {
                    var message = exception.Message;
                    throw;
                }
            };

            return result;
        }

异常发生在 XmlSerializer 构造函数上,而不是在加载 XML 时,因此反映类型存在一些问题。但是异常本身没有给我更多的信息:

System.StackOverflowException 未处理 HResult=-2147023895
消息=引发了“System.StackOverflowException”类型的异常。内部异常:

标签: c#xsdxml-serializationstack-overflowxsd.exe

解决方案


推荐阅读