序列化为XML时出现XmlChoiceIdentifier和List问题

时间:2014-12-10 11:20:21

标签: c# xml xml-serialization

我使用Xsd2Code从XSD架构生成C#类。

在架构中,我有以下摘录:

<hcparty>
  <firstname>some value</firstname>
  <familyname>some other value</familyname>
</hcparty>

该工具产生了以下类:

[Serializable]
public class hcpartyType
{

    private List<string> itemsField;

    private List<ItemsChoiceType> itemsElementNameField;

    /// <summary>
    /// hcpartyType class constructor
    /// </summary>
    public hcpartyType()
    {
        itemsElementNameField = new List<ItemsChoiceType>();
        itemsField = new List<string>();
    }

    //[XmlArrayItem(typeof(ItemChoiceType))]
    [XmlChoiceIdentifier("ItemsElementName")]
    public List<string> Items
    {
        get
        {
            return itemsField;
        }
        set
        {
            itemsField = value;
        }
    }

    [XmlIgnore()]
    public List<ItemsChoiceType> ItemsElementName
    {
        get
        {
            return itemsElementNameField;
        }
        set
        {
            itemsElementNameField = value;
        }
    }      
}

public enum ItemsChoiceType
{

    /// <remarks/>
    familyname,

    /// <remarks/>
    firstname,

    /// <remarks/>
    name,
}

首先,我必须添加[Serializable]类装饰,因为它缺失了。

序列化为XML时出现此错误:

Type of choice identifier 'ItemsElementName' is inconsistent with type of 'Items'. Please use array of System.Collections.Generic.List`1[[MyNamespace.ItemsChoiceType, ...]].

好的,所以我补充道:

[XmlArrayItem(typeof(ItemChoiceType))]

在上面的代码我评论它。我猜它是在正确的地方。错误仍然存​​在。

我阅读了下面的链接,所以我想知道这个错误是否仍然适用,我必须将我的列表更改为数组。

任何有相同设计问题的人? Blog post about somewhat my case

XmlSerializer issue with XmlChoiceIdentifier

1 个答案:

答案 0 :(得分:1)

Xml Serializer期望XmlChoiceIdentifier成员的类型是一个Array。列表不受支持。

尝试以下方法:

[Serializable]
public class hcpartyType
{

    private List<string> itemsField;

    private List<ItemsChoiceType> itemsElementNameField;

    [XmlChoiceIdentifier("ItemsElementName")]
    public string[] Items
    {
        get
        {
            return itemsField;
        }
        set
        {
            itemsField = value;
        }
    }

    [XmlIgnore()]
    public ItemsChoiceType[] ItemsElementName
    {
        get
        {
            return itemsElementNameField;
        }
        set
        {
            itemsElementNameField = value;
        }
    }      
}

public enum ItemsChoiceType
{

    /// <remarks/>
    familyname,

    /// <remarks/>
    firstname,

    /// <remarks/>
    name,
}