Исключение сериализации: попытка десериализации пустого потока - PullRequest
0 голосов
/ 21 сентября 2019

Я создаю игру и использую ее в качестве системы сохранения / загрузки, затем сохраняю данные в отдельном скрипте «GameData».Когда я впервые пытаюсь запустить игру, я получаю следующую ошибку:

Исключение сериализации: Попытка десериализации пустого потока.

Я пытался проверить, была ли длинабольше 0 и попытался попробовать / поймать версию.Оба они получают ту же ошибку, и она застревает в цикле.Возможно, есть способ проверить, если вы впервые открываете игру и сохраняете ее первым?Я бы предпочел просто найти способ убедиться, что в файле есть данные перед загрузкой.Или, может быть, я мог бы создать данные вместо использования null?Мы будем благодарны за любую помощь.

Это полная версия скрипта.

using UnityEngine;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;
using System;

public static class SaveSystem
{
    public static void SaveData(PlayerCollision playerCol)
    {
        BinaryFormatter formatter = new BinaryFormatter();
        string path = Application.persistentDataPath + "/player.fun";
        FileStream stream = new FileStream(path, FileMode.Create);

        GameData data = new GameData(playerCol);

        formatter.Serialize(stream, data);
        stream.Close();
    }

    public static GameData LoadData()
    {
        string path = Application.persistentDataPath + "/player.fun";
        if (File.Exists(path) && path.Length > 0)
        {
            BinaryFormatter formatter = new BinaryFormatter();
            FileStream stream = new FileStream(path, FileMode.Open);
            GameData data = formatter.Deserialize(stream) as GameData;
            stream.Close();
            return data;
        }
        else
        {
            Debug.LogError("Save file was not found in " + path);
            return null;

        }
    }
}

Это версия скрипта try / catch.

using UnityEngine;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;
using System;

public static class SaveSystem
{
    public static void SaveData(PlayerCollision playerCol)
    {
        BinaryFormatter formatter = new BinaryFormatter();
        string path = Application.persistentDataPath + "/player.fun";
        FileStream stream = new FileStream(path, FileMode.Create);

        GameData data = new GameData(playerCol);

        formatter.Serialize(stream, data);
        stream.Close();
    }

    public static GameData LoadData()
    {
        try
        {
            string path = Application.persistentDataPath + "/player.fun";
            if (File.Exists(path))
            {
                BinaryFormatter formatter = new BinaryFormatter();
                FileStream stream = new FileStream(path, FileMode.Open);
                GameData data = formatter.Deserialize(stream) as GameData;
                stream.Close();
                return data;
            }
            else
            {
                Debug.LogError("Save file was not found in " + path);
                return null;
            }
        }
        catch (System.Exception e)
        {
            Debug.LogError("Error Loading Save " + e);
            return null;
        }
    }
}

1 Ответ

0 голосов
/ 21 сентября 2019

Я просто публикую окончательное решение, потому что многие люди исправляют ошибки и не делятся и не публикуют сообщения, чтобы помочь кому-либо в будущем.Как указывалось выше, «Dymaniod» указал, что я хотел использовать «stream.length» вместо «path.length», потому что, поскольку «WarmedxMints» также указывал ответы на единство, путь всегда будет иметь большую длину, чем 0. Я все еще получилошибка загрузки.Окончательный сценарий, который работал ниже.Спасибо вам обоим, кто помог !!

using UnityEngine;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;
using System;

public static class SaveSystem
{



    public static void SaveData(PlayerCollision playerCol)
    {
        BinaryFormatter formatter = new BinaryFormatter();
        string path = Application.persistentDataPath + "/player.fun";
        FileStream stream = new FileStream(path, FileMode.Create);

        GameData data = new GameData(playerCol);

        formatter.Serialize(stream, data);
        stream.Close();
    }

    public static GameData LoadData(PlayerCollision playerCol)
    {
        string path = Application.persistentDataPath + "/player.fun";
        FileStream stream = new FileStream(path, FileMode.Open);
        if (File.Exists(path) && stream.Length > 0)
        {
            BinaryFormatter formatter = new BinaryFormatter();
            GameData data = formatter.Deserialize(stream) as GameData;
            stream.Close();
            return data;
        }
        else
        {
            Debug.LogError("Save file was not found in " + path);
            BinaryFormatter formatter = new BinaryFormatter();
            GameData data = new GameData(playerCol);
            formatter.Serialize(stream, data);
            stream.Close();
            return data;
        }
    }

}
...