如何初始化用System.Xml.Serialization.XmlElementAttribute(String,Type)修饰的类型

时间:2011-10-26 09:19:38

标签: c# .net xml-serialization

我正在使用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;
        }
    }
}

问题:如何初始化类型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>

1 个答案:

答案 0 :(得分:1)

(注释)

  

当我这样尝试时,它无法序列化:

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>