I was trying to save and load a game but got this error:
SerializationException: End of Stream encountered before parsing was completed. System.Runtime.Serialization.Formatters.Binary.__BinaryParser.Run () (at :0) System.Runtime.Serialization.Formatters.Binary.ObjectReader.Deserialize (System.Runtime.Remoting.Messaging.HeaderHandler handler, System.Runtime.Serialization.Formatters.Binary.__BinaryParser serParser, System.Boolean fCheck, System.Boolean isCrossAppDomain, System.Runtime.Remoting.Messaging.IMethodCallMessage methodCallMessage) (at :0) System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize (System.IO.Stream serializationStream, System.Runtime.Remoting.Messaging.HeaderHandler handler, System.Boolean fCheck, System.Boolean isCrossAppDomain, System.Runtime.Remoting.Messaging.IMethodCallMessage methodCallMessage) (at :0) System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize (System.IO.Stream serializationStream, System.Runtime.Remoting.Messaging.HeaderHandler handler, System.Boolean fCheck, System.Runtime.Remoting.Messaging.IMethodCallMessage methodCallMessage) (at :0) System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize (System.IO.Stream serializationStream, System.Runtime.Remoting.Messaging.HeaderHandler handler, System.Boolean fCheck) (at :0) System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize (System.IO.Stream serializationStream, System.Runtime.Remoting.Messaging.HeaderHandler handler) (at :0) System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize (System.IO.Stream serializationStream) (at :0) SaveManager.LoadFile () (at Assets/SaveGame/SaveManager.cs:42) SaveManager.Load () (at Assets/SaveGame/SaveManager.cs:28) UnityEngine.Events.InvokableCall.Invoke () (at <7c9c9bc2498143d08e2e3c523ff86731>:0) UnityEngine.Events.UnityEvent.Invoke () (at <7c9c9bc2498143d08e2e3c523ff86731>:0) UnityEngine.UI.Button.Press () (at D:/Program Files/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) (at D:/Program Files/2019.4.23f1/Editor/Data/Resources/PackageManager/BuiltInPackages/com.unity.ugui/Runtime/UI/Core/Button.cs:110) UnityEngine.EventSystems.ExecuteEvents.Execute (UnityEngine.EventSystems.IPointerClickHandler handler, UnityEngine.EventSystems.BaseEventData eventData) (at D:/Program Files/2019.4.23f1/Editor/Data/Resources/PackageManager/BuiltInPackages/com.unity.ugui/Runtime/EventSystem/ExecuteEvents.cs:50) UnityEngine.EventSystems.ExecuteEvents.Execute[T] (UnityEngine.GameObject target, UnityEngine.EventSystems.BaseEventData eventData, UnityEngine.EventSystems.ExecuteEvents+EventFunction`1[T1] functor) (at D:/Program Files/2019.4.23f1/Editor/Data/Resources/PackageManager/BuiltInPackages/com.unity.ugui/Runtime/EventSystem/ExecuteEvents.cs:261) UnityEngine.EventSystems.EventSystem:Update() (at 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);
}
}
}
}