我正在尝试使用c#中的二进制序列化来保存我的自定义类。我有序列化工作正常(据我所知,我没有错误),但当我尝试反序列化时,我得到以下错误:
SerializationException: Unexpected binary element: 255
有没有人知道可能导致这种情况的原因?我在Unity游戏引擎中使用C#。
编辑:
这是代码,它在我的编辑器窗口的类中。
public static LevelMetaData LoadAllLevels()
{
string filepath = Path.Combine(Application.dataPath, "Levels/meta.dat");
BinaryFormatter serializer = new BinaryFormatter();
if (File.Exists(filepath))
{
using (StreamReader sr = new StreamReader(filepath))
{
return (LevelMetaData)serializer.Deserialize(sr.BaseStream);
}
}
else
{
LevelMetaData temp = new LevelMetaData();
using (StreamWriter sw = new StreamWriter(filepath))
{
serializer.Serialize(sw.BaseStream, temp);
}
return temp;
}
}
编辑2:
这是LevelMetaData类:
[Serializable]
public class LevelMetaData
{
public LevelMetaData()
{
keys = new List<string>();
data = new List<LevelController>();
}
public LevelController this[string key]
{
get
{
if (keys.Contains(key))
return data[keys.IndexOf(key)];
else
throw new KeyNotFoundException("Level with key \"" + key + "\"not found.");
}
}
public void Add(string key, LevelController level)
{
if (!keys.Contains(key))
{
keys.Add(key);
data.Add(level);
}
}
public bool Contains(string key)
{
return keys.Contains(key);
}
public List<string> keys;
public List<LevelController> data;
}
答案 0 :(得分:0)
经过一段时间的沉睡和一些谷歌搜索后,我发现我应该使用FileStream
课而不是StreamReader
和StreamWriter
。改变它使它工作。
答案 1 :(得分:0)
我得到了同样的错误,但这是由于二进制格式化程序序列化方法创建的损坏文件造成的。就我而言,我观察到序列化时出现了JIT编译错误。这是以某种方式创建一个文件,但没有正确的数据,因此每当我尝试反序列化时,我得到了“意外的二进制元素:255”消息。
如果您在序列化方法中也发现此行为,请阅读this。
使用格式化程序减少在monobehavior中使用此行:
// Forces a different code path in the BinaryFormatter that doesn't rely on run-time code generation (which would break on iOS).
enter code here`Environment.SetEnvironmentVariable("MONO_REFLECTION_SERIALIZER", "yes");
如需进一步解释为何需要此项,请访问referenced link。
答案 2 :(得分:0)
如果您尝试添加代码解决方案并认为它没有帮助,您必须从设备上卸载该应用程序。
这是因为您首先尝试创建的文件存在数据损坏。
我遇到了问题,并解决了这个问题。