BinaryFormatter, кажется, портит словари - PullRequest
0 голосов
/ 28 апреля 2020

[Редактировать] Я вижу, что почему-то пост понижен. Я не знаю почему, но я уверен, что сделал что-то не так. Так что, пожалуйста, если у вас есть время, подумайте о том, чтобы прокомментировать и рассказать, что не так с постом, пожалуйста, прежде чем вы понизите его :) Спасибо

Итак, у меня есть эта часть моей Сберегательной системы, в которой я хочу сериализовать вложенный словарь, заданный функцией CaptureState. В моей отладке я проверяю, возвращает ли CaptureState словарь со значением под ключом SceneManager.GetActiveScene (). BuildIndex. Это доказывает, что метод действительно возвращает нужный словарь. Однако, если я сериализую его, а затем десериализую, словарь испортится. Он содержит только 1 элемент (он должен содержать 7), и этот элемент находится под ключом 1 (SceneManager.GetActiveScene (). BuildIndex равен 0 на момент тестирования) (эти вещи не отображаются в прилагаемом коде, но поверьте мне: D) И, конечно же (как мы видим в прикрепленном фрагменте кода), попытка доступа к ключу SceneManager.GetActiveScene (). buildIndex (который равен 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
        }
    }

1 Ответ

0 голосов
/ 28 апреля 2020

Хорошо, я нашел решение. Проблема заключалась в том, что я запустил сериализацию и передал параметр, содержащий функцию, которая тем временем запустила десериализацию. Таким образом, они выполняли сериализацию и десериализацию одновременно, что привело к странным результатам.

...