集合和枚举器需要如何修复无参数构造函数。错误 [英] How to fix parameterless constructor is required for collections and enumerators. Error
问题描述
我有一个从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 fromIEnumerable
toList
:
public class NpcEquippedGear : List<KeyValuePair<EquipmentSlot, ItemTemplate>> { ... }
or even easier, inherit fromDictionary
, which is ALREADY a collection ofKeyValuePair
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屋!