【发布时间】:2015-04-04 03:13:35
【问题描述】:
我有一个名为 serializableVector2 的类:
[Serializable]
class serializableVector2
{
public float x, y;
public serializableVector2(int x, int y)
{
this.x = x;
this.y = y;
}
}
我有一个名为 savedMapTile 的结构:
[Serializable]
struct savedMapTile
{
public oreInstance ore;
public int backgroundTileId;
public int playerId;
public tree tree;
}
我有一本使用这两个类的字典:
[SerializeField]
Dictionary<serializableVector2, savedMapTile> savedTiles;
我正在尝试加载这个字典修改它,然后使用序列化再次保存它。
我正在像这样反序列化字典:
FileStream f = File.Open(saveFileName, FileMode.Open);
BinaryFormatter b = new BinaryFormatter();
savedTiles = (Dictionary<serializableVector2, savedMapTile>)b.Deserialize(f);
f.Close();
我正在像这样序列化它:
FileStream f = File.Open(saveFileName, FileMode.Create);
BinaryFormatter b = new BinaryFormatter();
b.Serialize(f, savedTiles);
f.Close();
但是,当我尝试访问我知道应该存在的字典中的元素时,我收到以下错误:
System.Collections.Generic.KeyNotFoundException:给定的密钥不是 出现在字典中。
运行此代码时出现此错误:
id = (savedTiles[new serializableVector2(-19,13)].backgroundTileId);
我发现真正奇怪的是,我还能够打印出整个字典键及其值。这是我得到 Vector2 的值 -19 和 13 的地方。我像这样打印键和值:
for (int i = 0; i < 100; i++ )
{
UnityEngine.Debug.Log(vv[i].x +" "+vv[i].y);
UnityEngine.Debug.Log(x[i].backgroundTileId);
}
此时我真的很难过,我不知道发生了什么。我可以看到文件保存在 Windows 资源管理器中,我可以访问字典中的键和值,但我似乎无法正确使用它。同样重要的是要注意,当我在字典上使用 .Contains() 方法时,与尝试访问值的方式类似,它总是返回 false。
这是一个 Unity 5 项目,在 Windows 8.1 上运行的 Visual Studio 中使用 C#。
【问题讨论】:
-
除其他外,您的
FileStream实例需要位于using块中。
标签: c# serialization dictionary unity3d