EADever Ответов: 2

Как исправить непараметрический конструктор, необходимый для коллекций и перечислителей. Ошибка


у меня есть программа для чтения значений из xml-файла.

у меня есть xml-элемент, который нужно читать следующим образом:
<equipment>
    <item>114301725</item>
    <item>111301657</item>
    <item>113301688</item>
    <item>100201432</item>
    <item>112301596</item>
    <item>100201432</item>
    <item>110301719</item>
</equipment>


но когда я пытаюсь запустить программу, она показывает мне ошибку:
--- > Система.InvalidOperationException: не удалось десериализовать global:: WorldServer. Data.Шаблоны.Npc2.NpcEquippedGear. Для коллекций и перечислителей требуется конструктор без параметров.

Так как же я могу исправить эту ошибку?

Что я уже пробовал:

Вот мой код для чтения
[XmlElement("equipment")]
        public NpcEquippedGear equipment;


и класс NpcEquipedGear:
public class NpcEquippedGear : IEnumerable<KeyValuePair<EquipmentSlot, ItemTemplate>>
    {
        private Dictionary<EquipmentSlot, ItemTemplate> items;
        private int mask;
        private NpcEquipmentList v;
        public NpcEquippedGear(NpcEquipmentList v)
        {
            this.v = v;
        }

        public void Add(object o)
        {

        }

        public int getItemsMask()
        {
            if (items == null)
                init();
            return mask;
        }

        public void init()
        {
            lock(this)
            {
                if (items == null)
                {
                    items = new Dictionary<EquipmentSlot, ItemTemplate>();
                    foreach (ItemTemplate item in v.items)
                    {
                        if (items[item.EquipmentSlot] == null)
                        {
                            items.Add(item.EquipmentSlot, item);
                            mask |= (int)item.EquipmentSlot;
                        }
                    }
                }
                v = null;
            }
        }

        public ItemTemplate GetItem(EquipmentSlot slot)
        {
            return items != null ? items[slot] : null;
        }

        public IEnumerator GetEnumerator()
        {
            return GetEnumerator();
        }

        IEnumerator<KeyValuePair<EquipmentSlot, ItemTemplate>> IEnumerable<KeyValuePair<EquipmentSlot, ItemTemplate>>.GetEnumerator()
        {
            return items.GetEnumerator();
        }
    }

2 Ответов

Рейтинг:
20

#realJSOP

Добавьте перегрузку конструктора, который не принимает параметры. Ошибка говорит вам, что именно не так.

public NpcEquippedGear()
{
}


Конечно, вы могли бы облегчить себе задачу и изменить унаследованный класс от IEnumerable к List:

public class NpcEquippedGear : List<KeyValuePair<EquipmentSlot, ItemTemplate>>
{
...
}


или еще проще, унаследовать от Dictionary, который уже является коллекцией KeyValuePair объекты:

public class NpcEquippedGear : Dictionary<EquipmentSlot, ItemTemplate>
{
...
}


На самом деле нет никакой необходимости делать вещи сложнее, чем это необходимо.


Рейтинг:
1

Dave Kreskowiak

Сообщение об ошибке действительно ясно говорит об этом. Вам нужно добавить публичный конструктор, который не принимает никаких параметров.

Код десериализации создает экземпляр вашей коллекции, но никогда не будет иметь понятия о том, что ему передать, поэтому ему нужен способ создать экземпляр вашей коллекции без передачи каких-либо параметров.