C# System.Xml序列化value字段不生成标签,是特性还是Bug?
问题:System.Xml序列化时字段名"value"无法生成XML标签
问题重现
属性定义代码
[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, IsNullable=true)] public System.Nullable<decimal> value { get { return this.valueField1; } set { this.valueField1 = value; } }
请求实例设置代码
filterGroup.numberFilters[0] = new numberFilter() { field = "ID", operation = numberOperation.EQUAL, value = 99 };
异常序列化结果(缺失标签)
<numberFilters> <field>ID</field> <operation>EQUAL</operation> </numberFilters>
修改字段名后的正常序列化结果
<numberFilters> <field>ID</field> <operation>EQUAL</operation> <valueKA>99</valueKA> </numberFilters>
原因分析
这是System.Xml序列化框架的特性,不是Bug。XmlSerializer对名为value的属性有特殊逻辑:当类包含名为value的属性时,框架会默认将其识别为类的"值属性"(即对应XML元素的文本内容),而非独立的子元素。但如果类同时存在其他属性(如field、operation),这种默认逻辑会导致冲突,最终value属性被跳过,不生成对应的XML标签。
解决方法
显式在XmlElementAttribute中指定ElementName,覆盖框架的默认行为:
[System.Xml.Serialization.XmlElementAttribute(ElementName = "value", Form=System.Xml.Schema.XmlSchemaForm.Unqualified, IsNullable=true)] public System.Nullable<decimal> value { get { return this.valueField1; } set { this.valueField1 = value; } }
修改后,序列化即可正常生成<value>标签。
内容的提问来源于stack exchange,提问作者m_and_m
相关产品推荐
相关产品推荐

