如何初始化用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>

如何初始化用System.Xml.Serialization装饰的类型.XmlElementAttribute(字符串类

(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>