在反序列化时初始化构造函数内的属性

时间:2014-09-17 11:35:22

标签: c# xml constructor deserialization xsd2code

我使用Xsd2Code生成类。但是其中一个类导致我的构造函数出现问题,因为循环并抛出StackOverflowException。

[System.CodeDom.Compiler.GeneratedCodeAttribute("Xsd2Code", "3.4.0.32990")]
[System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = true)]
public partial class ApproverType : INotifyPropertyChanged
{
    private ApproverType replacesField;

    public ApproverType()
    {
        this.replacesField = new ApproverType();
    }

    public ApproverType Replaces
    {
        get
        {
            return this.replacesField;
        }
        set
        {
            if ((this.replacesField != null))
            {
                if ((replacesField.Equals(value) != true))
                {
                    this.replacesField = value;
                    this.OnPropertyChanged("Replaces");
                }
            }
            else
            {
                this.replacesField = value;
                this.OnPropertyChanged("Replaces");
            }
        }
    }
}

2 个答案:

答案 0 :(得分:1)

您的XSD中如何Replaces属性?可能它是必需的元素,并且该工具生成符合合同的实例。

然后,您可以尝试更改定义,使其成为可选项。

如果是这样的话:

<xs:element name="Replaces" type="ApproverType" use="required" />

然后您必须将其更改为:

<xs:element name="Replaces" type="ApproverType" use="optional" />

编辑: 无论如何,方案都是不正确的,因为在xml中也不可能使用递归的必需元素:

<ApproverType>
 <Replaces>
   <Replaces>
     <Replaces>
       <Replaces>
        ... infinite
 <Replaces>
 <OtherProperty />
<ApproverType>

编辑:

一种可能的解决方法是将支持属性作为单个元素的集合:

public List<ApproverType> ReplacesWorkaround { ... }

在部分课程的另一部分:

public ApproverType Replaces
{
 get
 {
  return ReplacesWorkaround.SingleOrDefault();
 }
 set
 {
  ReplacesWorkaround.RemoveAll();
  ReplacesWorkaround.Add(value);
 }
}

答案 1 :(得分:0)

问题是还有其他类这样的..显然这个工具有点儿错误。 https://xsd2code.codeplex.com/workitem/7419

我使用的是3.4.0.32990版。有没有办法解决这个问题,很容易