当我试图序列化一个对象时,我今天遇到了一个奇怪的问题.该对象是通过Web服务(svcutil.exe)中的"添加服务引用"生成的.
问题是以下属性(agencyId)没有与对象的其余部分序列化.出于绝望,我评论了它下面的属性,因为它已经分配了"XMLIgnoreAttribute"...在我评论了被忽略的属性之后,agencyId字段按预期序列化了.
有人可以向我解释为什么会发生这种行为?谢谢!!
///[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=1)] public string agencyId { get { return this.agencyIdField; } set { this.agencyIdField = value; this.RaisePropertyChanged("agencyId"); } } /// [System.Xml.Serialization.XmlIgnoreAttribute()] public bool agencyIdSpecified { get { return this.agencyIdFieldSpecified; } set { this.agencyIdFieldSpecified = value; this.RaisePropertyChanged("agencyIdSpecified"); } }
Marc Gravell.. 5
有一个模式(对于XmlSerializer),属性Foo也会查找"bool FooSpecified"或"bool ShouldSerializeFoo()" - 如果找到,只有序列化Foo,如果这个其他成员返回true.所以我假设agencyIdSpecified从未被设置为true?删除此成员将使其始终序列化(除非您添加[DefaultValue]
或类似).
这种行为用于在我们确实需要知道它是否在原始数据中时对可选值进行建模 - 即它是否具有值0,因为调用者告诉我们该数字,或者因为这只是默认值.
请注意,"FooSpecified"成员通常具有[XmlIgnore]
XmlSerializer知道它不应被视为序列化的数据.对于"ShouldSerializeFoo()",这不是必需的(或实际上是合法的),因为方法永远不会被序列化.
有一个模式(对于XmlSerializer),属性Foo也会查找"bool FooSpecified"或"bool ShouldSerializeFoo()" - 如果找到,只有序列化Foo,如果这个其他成员返回true.所以我假设agencyIdSpecified从未被设置为true?删除此成员将使其始终序列化(除非您添加[DefaultValue]
或类似).
这种行为用于在我们确实需要知道它是否在原始数据中时对可选值进行建模 - 即它是否具有值0,因为调用者告诉我们该数字,或者因为这只是默认值.
请注意,"FooSpecified"成员通常具有[XmlIgnore]
XmlSerializer知道它不应被视为序列化的数据.对于"ShouldSerializeFoo()",这不是必需的(或实际上是合法的),因为方法永远不会被序列化.