Проблема XmlChoiceIdentifier и List при сериализации в XML

1

Я использовал Xsd2Code для генерации классов С# из схемы XSD.

В схеме у меня есть следующая выдержка:

<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))]

в коде выше, где я прокомментировал это. Наверное, это на правильном месте. Ошибка остается.

Я прочитал ссылку ниже, так что мне интересно, все еще применяется ошибка, и мне нужно изменить свой список на массив.

Кто-нибудь с тем же вопросом дизайна? Сообщение в блоге о моем случае

Проблема XmlSerializer с XmlChoiceIdentifier

  • 1
    Может ли один элемент HCParty содержать несколько фамилий? Если у вас может быть только один из каждого элемента name, вы сможете добавить их как отдельные свойства класса (а не List <string>) и пропустить сложность.
Теги:
xml-serialization

1 ответ

0
Лучший ответ

Сегментатор Xml ожидает, что тип элемента XmlChoiceIdentifier будет массивом. Списки не поддерживаются.

Попробуйте следующее:

[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,
}
  • 0
    Спасибо за воскрешение и ответ на такой старый вопрос, я даже не напомнил, хахаха

Ещё вопросы

Сообщество Overcoder
Наверх
Меню