Я использовал 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))]
в коде выше, где я прокомментировал это. Наверное, это на правильном месте. Ошибка остается.
Я прочитал ссылку ниже, так что мне интересно, все еще применяется ошибка, и мне нужно изменить свой список на массив.
Кто-нибудь с тем же вопросом дизайна? Сообщение в блоге о моем случае
Сегментатор 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,
}