如何初始化用System.Xml.Serialization装饰的类型.XmlElementAttribute(字符串类
本文关键字:类型 XmlElementAttribute 字符串 初始化 System Serialization Xml | 更新日期: 2023-09-27 18:12:20
我正在使用WCF Web API开发RESTful Web服务。另一方提供了XSD文件。我用xsd.exe生成c#类。然而,模式包含一个复杂的类型,我有一个问题:
<xs:complexType name="SearchableField">
<xs:choice>
<xs:element name="NumericValue" type="xs:float" minOccurs="1" maxOccurs="1"/>
<xs:element name="BooleanValue" type="xs:boolean" minOccurs="1" maxOccurs="1"/>
</xs:choice>
<xs:attribute name="type" type="SearchableFieldType" use="required"/>
</xs:complexType>
这是为复杂类型生成的代码:[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.1")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
public partial class SearchableField {
private object itemField;
private string typeField;
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute("BooleanValue", typeof(bool), Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
[System.Xml.Serialization.XmlElementAttribute("NumericValue", typeof(float), Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
public object Item {
get {
return this.itemField;
}
set {
this.itemField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlAttributeAttribute()]
public string type {
get {
return this.typeField;
}
set {
this.typeField = value;
}
}
}
问题:如何初始化type Item属性-这是一个普通对象-以便它可以根据模式进行序列化。
约束:模式已经指定,所以我可能不会更改XSD文件。
下面是一个XML元素的示例:
<SearchableFields>
<SearchableField type="MEGAPIXELS">
<NumericValue>12</NumericValue>
</SearchableField>
<SearchableField type="WEATHER_RESISTANT">
<BooleanValue>true</BooleanValue>
</SearchableField>
<SearchableField type="WATER_RESISTANT">
<BooleanValue>false</BooleanValue>
</SearchableField>
</SearchableFields>
(comments)
当我这样尝试时,它不能被序列化:
var field = new SearchableField { type = "monitor_size", Item = 5 };
确实- NumericValue
在xml/c#中被声明为float
,使用int
将会引入无效的强制类型转换;不过,这是可行的:
var field = new SearchableField { type = "monitor_size", Item = 5F };
与输出:<SearchableField type="monitor_size">
<NumericValue>5</NumericValue>
</SearchableField>