集合和枚举器需要如何修复无参数构造函数。错误 [英] How to fix parameterless constructor is required for collections and enumerators. Error

查看:71
本文介绍了集合和枚举器需要如何修复无参数构造函数。错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个从xml文件中读取值的程序。



i有xml元素需要像这样读取:

 <  设备 >  
< item > 114301725 < / item >
< item > 111301657 < / item >
< item > 113301688 < / item >
< item > 100201432 < / item >
< item > 112301596 < / item >
< item > 100201432 < / item >
< item > 110301719 < / item >
< / equipment >





但是当我尝试运行程序时它会显示错误:

---> System.InvalidOperationException:无法反序列化global :: WorldServer.Data.Templates.Npc2.NpcEquippedGear。集合和枚举器需要无参数构造函数。



那我该怎么做才能解决这个错误?



我的尝试:



这是我的代码阅读

 [XmlElement(  equipment)] 
public NpcEquippedGear设备;





和NpcEquipedGear类:

  public   class  NpcEquippedGear:IEnumerable< KeyValuePair< EquipmentSlot,ItemTemplate>> 
{
私人字典< EquipmentSlot,ItemTemplate>项目;
private int mask;
private NpcEquipmentList v;
public NpcEquippedGear(NpcEquipmentList v)
{
this .v = v;
}

public void 添加( object o)
{

}

public < span class =code-keyword> int getItemsMask()
{
if (items == null
init();
返回掩码;
}

public void init()
{
lock
{
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();
}
}

解决方案

添加不接受参数的构造函数的重载。错误告诉你究竟出了什么问题。



<前一个=C#> public NpcEquippedGear()
{
}





当然,你可以让自己更容易,并从<改变继承的类code> IEnumerable 到列表



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





甚至更容易,继承自 Dictionary ,它是 KeyValuePair 对象的集合:



< pre lang =C#> public class NpcEquippedGear:Dictionary< EquipmentSlot,ItemTemplate>
{
...
}





真的没有必要让事情变得比必要的。


错误信息对此非常清楚。你需要添加一个不带任何参数的公共构造函数。



反序列化代码创建你的集合的一个实例,但永远不会知道要传递什么因此它需要一种方法来创建集合的实例而不传递任何参数。


i have a program to read values from xml file.

i have xml element need to be read like this:

<equipment>
    <item>114301725</item>
    <item>111301657</item>
    <item>113301688</item>
    <item>100201432</item>
    <item>112301596</item>
    <item>100201432</item>
    <item>110301719</item>
</equipment>



but when i try to run program its show me error:
---> System.InvalidOperationException: Could not deserialize global::WorldServer.Data.Templates.Npc2.NpcEquippedGear. Parameterless constructor is required for collections and enumerators.

So how can i do to fix this error?

What I have tried:

Here is my code to read

[XmlElement("equipment")]
        public NpcEquippedGear equipment;



and NpcEquipedGear class:

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();
        }
    }

解决方案

Add an overload of the constructor that doesn't accept parameters. The error tells you exactly what's wrong.

public NpcEquippedGear()
{
}



Of course, you could make things easier on yourself and change the inherited class from IEnumerable to List:

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



or even easier, inherit from Dictionary, which is ALREADY a collection of KeyValuePair objects:

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



There really is no need to make things harder than necessary.


The error message is really clear about this. You need to add a public constructor that doesn't take any parameters.

The deserialization code creates an instance of your collection but will never have a clue about what to pass to it so it needs a way to create an instance of your collection without passing any parameters.


这篇关于集合和枚举器需要如何修复无参数构造函数。错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆