C#二进制序列化“unexpected binary element: 225”

3
我尝试在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;
}

2
你的序列化数据已经损坏。请向我们展示你的代码。 - SLaks
1
请展示您的LevelMetaData类。 - S.Richmond
3个回答

1
经过一些睡眠和更多的谷歌搜索,我发现应该使用 FileStream 类代替 StreamReaderStreamWriter。更改后它可以工作。

2
这不可能。你一定做错了其他事情。 - Radu Simionescu

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");

如需进一步解释为什么您需要此内容,请访问参考链接


0

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

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

我曾经遇到过这个问题,而这种方法解决了问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接