我在尝试反序列化游戏保存文件中包含的字典时遇到了一个奇怪的错误。
我收到的错误是:
System.Runtime.Serialization.SerializationException:'此哈希表的键不存在。'
通过将结构序列化为具有BinaryFormatter
的文件来生成保存文件。
[Serializable]
public struct SaveData
{
public Dictionary<int, float> LevelClearTimes { get; set; }
public string PlayerName { get; set; }
public int PlayerID { get; set; }
public int LevelsCleared { get; set; }
}
...
protected bool Save(SaveData data)
{
try
{
BinaryFormatter bf = new BinaryFormatter();
FileStream file = File.Create(filename);
bf.Serialize(file, this);
file.Close();
}
catch { return false; }
return true;
}
序列化正在按预期工作而没有错误,但是当从不同的程序集反序列化数据时,抛出了SerializationException,但只有在以前序列化了空字典时 。
由于我试图从不同的程序集反序列化,我使用自定义的SerializationBinder来避免异常。
class BindChanger : System.Runtime.Serialization.SerializationBinder
{
public override Type BindToType(string assemblyName, string typeName)
{
Type typeToDeserialize = null;
string currentAssembly = Assembly.GetExecutingAssembly().FullName;
typeToDeserialize = Type.GetType(string.Format("{0}, {1}", typeName, currentAssembly));
return typeToDeserialize;
}
}
...
protected void Load(string file)
{
BinaryFormatter bf = new BinaryFormatter();
bf.Binder = new BindChanger();
FileStream file = File.OpenRead(filename);
object binaryData = bf.Deserialize(file); // the error is thrown here
SaveData data = (SaveData)binaryData;
...
}
奇怪的是,当尝试从保存它的原始程序集中反序列化数据时,没有错误。
有谁知道如何解决这个问题?
编辑:这里是不会被反序列化的二进制内容。
ÿÿÿÿ Assembly-CSharp SaveData <LevelClearTimes>k__BackingField<PlayerName>k__BackingField<PlayerID>k__BackingField<LevelsCleared>k__BackingField áSystem.Collections.Generic.Dictionary`2[[System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Single, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]] PlayerS›—T áSystem.Collections.Generic.Dictionary`2[[System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Single, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]] VersionComparerHashSize
KeyValuePairs ‘System.Collections.Generic.GenericEqualityComparer`1[[System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]
‘System.Collections.Generic.GenericEqualityComparer`1[[System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]