【发布时间】: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);
}
}
}
}
【问题讨论】:
-
你看过这个问题吗(可能重复):stackoverflow.com/a/306598/1627113
标签: c# unity3d binaryformatter