c# - 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”类型的异常。内部异常:
解决方案
推荐阅读
- architecture - 在学术界完成 MVP 后评估创建用例图的有用性
- android - 将所有标记为回收器视图android的读取按钮
- python - 如何在 Tkinter 中显示对类对象的每一次更改?
- django - 使用 django-cassandra-engine 时如何在 Cassandra 中存储媒体文件的路径?
- swift - 如何在同一天保存 CoreData 对象?
- c# - 有没有一种方法可以在不使用 APi 网关架构的情况下使用 Jwt 保护微服务端点
- node.js - 是否建议在 IIS 服务器上运行 NodeJS?
- java - Java 集合 - 按最大值分组、组合和重复数据删除
- java - 什么是“JVMTI_ERROR_NONE”?
- android - 将 ArrayList 存储为持久数据结构