【问题标题】:End of Stream encountered before parsing is completed解析完成前遇到流结束
【发布时间】:2021-05-13 09:20:31
【问题描述】:

我试图保存和加载游戏,但收到此错误:

SerializationException: End of Stream 在解析之前遇到 完全的。 System.Runtime.Serialization.Formatters.Binary.__BinaryParser.Run() (在:0) System.Runtime.Serialization.Formatters.Binary.ObjectReader.Deserialize (System.Runtime.Remoting.Messaging.HeaderHandler 处理程序, System.Runtime.Serialization.Formatters.Binary.__BinaryParser serParser, System.Boolean fCheck, System.Boolean isCrossAppDomain, System.Runtime.Remoting.Messaging.IMethodCallMessage 方法调用消息)(在:0) System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize (System.IO.Stream 序列化流, System.Runtime.Remoting.Messaging.HeaderHandler 处理程序, System.Boolean fCheck,System.Boolean isCrossAppDomain, System.Runtime.Remoting.Messaging.IMethodCallMessage 方法调用消息)(在:0) System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize (System.IO.Stream 序列化流, System.Runtime.Remoting.Messaging.HeaderHandler 处理程序, System.Boolean fCheck, System.Runtime.Remoting.Messaging.IMethodCallMessage 方法调用消息)(在:0) System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize (System.IO.Stream 序列化流, System.Runtime.Remoting.Messaging.HeaderHandler 处理程序, System.Boolean fCheck) (at :0) System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize (System.IO.Stream 序列化流, System.Runtime.Remoting.Messaging.HeaderHandler 处理程序)(在 :0) System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize (System.IO.Stream 序列化流)(在 :0) SaveManager.LoadFile () (在 Assets/SaveGame/SaveManager.cs:42) SaveManager.Load () (在 资产/SaveGame/SaveManager.cs:28) UnityEngine.Events.InvokableCall.Invoke() (在 :0) UnityEngine.Events.UnityEvent.Invoke () (在 :0) UnityEngine.UI.Button.Press() (在 D:/程序 文件/2019.4.23f1/Editor/Data/Resources/PackageManager/BuiltInPackages/com.unity.ugui/Runtime/UI/Core/Button.cs:68) UnityEngine.UI.Button.OnPointerClick (UnityEngine.EventSystems.PointerEventData eventData)(在 D:/Program 文件/2019.4.23f1/Editor/Data/Resources/PackageManager/BuiltInPackages/com.unity.ugui/Runtime/UI/Core/Button.cs:110) UnityEngine.EventSystems.ExecuteEvents.Execute (UnityEngine.EventSystems.IPointerClickHandler 处理程序, UnityEngine.EventSystems.BaseEventData eventData) (在 D:/Program 文件/2019.4.23f1/Editor/Data/Resources/PackageManager/BuiltInPackages/com.unity.ugui/Runtime/EventSystem/ExecuteEvents.cs:50) UnityEngine.EventSystems.ExecuteEvents.Execute[T] (UnityEngine.GameObject 目标,UnityEngine.EventSystems.BaseEventData 事件数据,UnityEngine.EventSystems.ExecuteEvents+EventFunction`1[T1] 函子)(在 D:/Program 文件/2019.4.23f1/Editor/Data/Resources/PackageManager/BuiltInPackages/com.unity.ugui/Runtime/EventSystem/ExecuteEvents.cs:261) UnityEngine.EventSystems.EventSystem:Update()(在 D:/Program Files/2019.4.23f1/Editor/Data/Resources/PackageManager/BuiltInPackages/com.unity.ugui/Runtime/EventSystem/EventSystem.cs:377)

public class SaveManager : MonoBehaviour
{
     private string SavePath => Path.Combine(Application.persistentDataPath, "save.text");

    private void Awake()
    {
        DontDestroyOnLoad(this);
    }
    public void Save()
    {
        var state = LoadFile();
        CaptureState(state);
        SaveFile(state);
    }

    public void Load()
    {
        var state = LoadFile();
        RestoreState(state);
    }

    private Dictionary<string, object> LoadFile()
    {
        if(!File.Exists(SavePath))
        {
            return new Dictionary<string, object>();
        }
        using(FileStream stream = File.Open(SavePath, FileMode.Open))
        {
            var formatter = new BinaryFormatter();
            return(Dictionary<string, object>)formatter.Deserialize(stream);
        }
    }

    private void SaveFile(object state)
    {
        using(var stream = File.Open(SavePath, FileMode.Create))
        {
            var formatter = new BinaryFormatter();
            formatter.Serialize(stream, state);
        }
    }

    private void CaptureState(Dictionary<string, object> state)
    {
        foreach(var saveable in FindObjectsOfType<Entity>())
        {
            state[saveable.Id] = saveable.CaptureState();
        }
    }

    private void RestoreState(Dictionary<string, object> state)
    {
        foreach(var saveable in FindObjectsOfType<Entity>())
        {
            if(state.TryGetValue(saveable.Id, out object value))
            {
                saveable.RestoreState(value);
            }
        }
    }
}

【问题讨论】:

标签: c# unity3d binaryformatter


【解决方案1】:

从“C:\Users\AppData\LocalLow”中删除保存的数据文件后,这一切都解决了,因为问题是我在保存文件后更改了数据模型,这使得文件中的现有数据模型不同,并使其在反序列化时引发错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多