- Home /
Deserialize (stream) wants CreateInstance method
I have been trying to create a Save system for a few days but I keep running into problems.
I think I need Scriptable Object for my data so it can be saved and used. Monobehaviour wont work because there's too much to strip out before saving (and errors), custom class wont work because I can't use it in my game easily.
I have a testing script which saves a Scriptable Object as binary, but I can't load the data back in without getting a warning.
SaveDataTest must be instantiated using the ScriptableObject.CreateInstance method instead of new SaveDataTest.
UnityEngine.ScriptableObject:.ctor()
SaveDataTest:.ctor(SerializationInfo, StreamingContext)
System.Runtime.Serialization.Formatters.Binary.BinaryFormatter:Deserialize(Stream)
SaveLoadTest:Load(String) (at Assets/Scripts/SaveDataTest.cs:56)
SaveLoadTest:Load() (at Assets/Scripts/SaveDataTest.cs:49)
mainScene:Pause() (at Assets/Scripts/mainScene.cs:154)
mainScene:Update() (at Assets/Scripts/mainScene.cs:91)
I'm not really sure if this will even work in the end but everything else seems to fail at some critical point and whydoidoit's package seems like far too much scripting to import to my game.
This script is a close copy of my original, I use SaveLoadTest.Save (); SaveLoadTest.Load (); in my main scene pause function to test it.
using UnityEngine;
using System.Text;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using System;
using System.Runtime.Serialization;
using System.Reflection;
[Serializable()]
public class SaveDataTest : ScriptableObject,ISerializable
{
public float score = 111;
public SaveDataTest ()
{
}
public SaveDataTest (SerializationInfo info, StreamingContext ctxt)
{
score = (float)info.GetValue ("score", typeof(float));
}
public void GetObjectData (SerializationInfo info, StreamingContext ctxt)
{
info.AddValue ("score", score);
}
}
public class SaveLoadTest
{
public static string currentFilePath = "SaveDataTest.bin";
public static void Save ()
{
Save (currentFilePath);
}
public static void Save (string filePath)
{
SaveDataTest data = ScriptableObject.CreateInstance<SaveDataTest> ();
Stream stream = File.Open (Application.persistentDataPath + "/" + filePath, FileMode.Create);
BinaryFormatter bformatter = new BinaryFormatter ();
bformatter.Binder = new VersionDeserializationBinder ();
bformatter.Serialize (stream, data);
stream.Close ();
}
public static void Load ()
{
Load (currentFilePath);
}
public static void Load (string filePath)
{
Stream stream = File.Open (Application.persistentDataPath + "/" + filePath, FileMode.Open);
BinaryFormatter bformatter = new BinaryFormatter ();
bformatter.Binder = new VersionDeserializationBinder ();
SaveDataTest data = (SaveDataTest)bformatter.Deserialize (stream); // this causes warning
stream.Close ();
Debug.Log (data.score);
}
}
public sealed class VersionDeserializationBinder : SerializationBinder
{
public override Type BindToType (string assemblyName, string typeName)
{
if (!string.IsNullOrEmpty (assemblyName) && !string.IsNullOrEmpty (typeName)) {
Type typeToDeserialize = null;
assemblyName = Assembly.GetExecutingAssembly ().FullName;
typeToDeserialize = Type.GetType (String.Format ("{0}, {1}", typeName, assemblyName));
return typeToDeserialize;
}
return null;
}
}
Your answer
Follow this Question
Related Questions
Deep Cloning using instantiate 1 Answer
Distribute terrain in zones 3 Answers
System.Xml.XmlException: Root element is missing 1 Answer
Multiple Cars not working 1 Answer
How to Instantiate a GameObject from a ScriptableObject piece of script? 0 Answers