c#二进制序列化“意外的二进制元素:225”

时间:2013-11-10 23:00:40

标签: c# serialization unity3d

我正在尝试使用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;
}

3 个答案:

答案 0 :(得分:0)

经过一段时间的沉睡和一些谷歌搜索后,我发现我应该使用FileStream课而不是StreamReaderStreamWriter。改变它使它工作。

答案 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)

如果您尝试添加代码解决方案并认为它没有帮助,您必须从设备上卸载该应用程序。

这是因为您首先尝试创建的文件存在数据损坏。

我遇到了问题,并解决了这个问题。