如何将单个属性映射到多个 XmlElementAttribute 以进行序列化?

Posted

技术标签:

【中文标题】如何将单个属性映射到多个 XmlElementAttribute 以进行序列化?【英文标题】:How do I map a single property to multiple XmlElementAttribute for serialization? 【发布时间】:2021-12-06 16:17:37 【问题描述】:

我有一个不知道如何实现的类。 不确定如何实例化并将 Quantity 选项设置为特定值。 序列化未产生所需的输出。 我正在尝试将类序列化为输出

<aaaa>  
    <Quantity>Quantity</Quantity>  
</aaaa>  

我期待的地方

<aaaa>  
    <Quantity>2</Quantity>  
</aaaa>  




    public class aaaa 
    private object itemField;

    [System.Xml.Serialization.XmlElementAttribute("Available", typeof(bool))]
    [System.Xml.Serialization.XmlElementAttribute("Lookup", typeof(string))]
    [System.Xml.Serialization.XmlElementAttribute("Quantity", typeof(string), DataType="nonNegativeInteger")]
    public object Item 
        get 
            return this.itemField;
        
        set 
            this.itemField = value;
        
    






private void myFunc()

   try 
    var myClass = new aaaa 
        Item = "Quantity"
    ;

        XmlSerializer serializer = new XmlSerializer(typeof(aaaa));
        serializer.Serialize(stringwriter , Item);

     catch (Exception ex) 

    


这是自动生成类的 XML。

    <?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xsd:element name="aaaa">
    <xsd:complexType>
        <xsd:sequence>
            <xsd:choice>
                <xsd:element name="Available" type="xsd:boolean"/>
                <xsd:element name="Quantity"  type="xsd:nonNegativeInteger"/>
                <xsd:element name="Lookup"    type="xsd:string"/>
            </xsd:choice>
        </xsd:sequence>
    </xsd:complexType>
</xsd:element>
</xsd:schema>

【问题讨论】:

有什么问题?请提供更多详细信息并提出具体问题。 "when I go to serialize" - 这并不演示您正在执行的具体操作。 "it barfed" - 这没有描述您观察到的具体错误。请澄清问题。 您不应该使用 System.Object 作为属性的声明返回类型 - 使用强类型。避免使用 C# 匿名类型,因为我们有 ValueTuples 和 Record Types,它们有点没用。 【参考方案1】:

要获得所需的输出,您必须以这种方式实例化您的类:

var aaaa = new aaaa();
aaaa.Item = "500";
aaaa.ItemElementName = ItemChoiceType.Quantity;

然后你会得到这个:

<aaaa xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <Quantity>500</Quantity>
</aaaa>

Item 包含元素的值,因此您必须确保该对象的类型尊重这些属性中的内容:

[System.Xml.Serialization.XmlElementAttribute("Available", typeof(bool))]
[System.Xml.Serialization.XmlElementAttribute("Lookup", typeof(string))]
[System.Xml.Serialization.XmlElementAttribute("Quantity", typeof(string), DataType="nonNegativeInteger")]

正如您所见,Quantity 是一个字符串,而不是一个实际的整数,因此使用整数是行不通的。

【讨论】:

添加此以完成代码:[System.SerializableAttribute()] [System.Xml.Serialization.XmlTypeAttribute(IncludeInSchema=false)] public enum ItemChoiceType Quantity 并添加到类 aaa public ItemChoiceTypeTest ItemElementName ;

以上是关于如何将单个属性映射到多个 XmlElementAttribute 以进行序列化?的主要内容,如果未能解决你的问题,请参考以下文章

如何将单个 .NET 类型映射到 ElasticSearch/NEST 中的多个嵌套对象类型?

将多个表动态映射到单个实体

将多个表映射到单个实体

RestKit – 使用关系映射将单个源映射到多个目的地

将单个键映射到多个值的序列文件

如何将多个值类型集合映射到 Hibernate 中的一个表?