首页 > 解决方案 > BinaryFormatter 似乎弄乱了嵌套字典

问题描述

[编辑] 我明白为什么帖子被降级了。我不知道为什么,但我确定我做错了什么。所以,如果你有时间,请考虑评论并告诉我这篇文章有什么问题,在你降级之前:)谢谢

所以,我有我的保存系统的这一部分,我想在其中序列化由一个名为 CaptureState 的函数给出的嵌套字典。在我的调试中,我检查 CaptureState 是否返回具有 SceneManager.GetActiveScene().buildIndex 键下的值的字典。它证明,该方法实际上返回了所需的字典。但是,如果我序列化它然后反序列化它,字典就会搞砸了。它仅包含 1 个项目(它应该包含 7 个),并且该项目位于键 1 下(SceneManager.GetActiveScene().buildIndex 在测试时为 0)(这些内容不会在附加代码中显示,但是相信我 :D) 当然(正如我们在附加的代码片段中看到的那样),尝试访问关键 SceneManager.GetActiveScene().buildIndex(which is 0) 会引发 KeyNotFoundException。如果重要,我会使用 Unity。

 void SaveFile(string saveFile)
    {
        string path = GetPathFromSaveFile(saveFile);
        using(FileStream stream = File.Open(path, FileMode.Open))
        {
            stream.Position = 0;
            BinaryFormatter formatter = new BinaryFormatter();
            formatter.Serialize(stream, CaptureState(LoadFile(path, stream, formatted)));
            //From this point, testing purposes
            stream.Position = 0;
            Dictionary<int, Dictionary<string, object>> testDicta = (Dictionary<int, Dictionary<string, object>>)CaptureState(LoadFile(path, stream, formatter));
            print(testDicta[SceneManager.GetActiveScene().buildIndex].Count); // Shows the proper count
            stream.Position = 0;
            Dictionary<int, Dictionary<string, object>> testDict = (Dictionary<int, Dictionary<string, object>>)formatter.Deserialize(stream);
            print(testDict[SceneManager.GetActiveScene().buildIndex].Count); // Throws me a KeyNotFoundException
        }
    }

标签: c#dictionaryunity3dserializationbinaryformatter

解决方案


好的,我找到了解决方案。问题是我启动了序列化,并传入了包含同时启动反序列化的函数的参数。所以他们同时在序列化和反序列化,这导致了奇怪的结果。


推荐阅读