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