简体   繁体   中英

serialization exemption when saving a binary file in Unity3d

I'm trying to save two elements, a string and a list of strings to a binary file. I have the class set outside the main script:

}
 the main script
}
[Serializable]
class SaveManager
{
    public string Info;
    public List<InfoSheetList> InfoSheetList ;

}

Then the function that calls it all

public void GetInfoSheet() 
    {

        DatabaseManager.Instance.SQLiteInit();
        string Info = PlayerPrefs.GetString ("Info");
        string date = PlayerPrefs.GetString ("Date");
        string Date=date.Replace("/","-");
        string Name = PlayerPrefs.GetString ("Name");
        string FilePath="C:/InfoSheets";

        DatabaseManager.Instance.SQLiteInit();
        InfoSheetList.Clear();
        InfoSheetList= DatabaseManager.Instance.MakeInfoSheetList();
        Debug.Log("How many in the list " + InfoSheetList.Count);

        BinaryFormatter bf = new BinaryFormatter();
        FileStream fs = File.Create(FilePath + "/" +Date+Name+"InfoSheet.gig");
        Debug.Log (fs);
        SaveManager sm= new SaveManager();
        sm.Info=Info;
        sm.InfoSheetList=InfoSheetList;
        //PlayerPrefs.DeleteAll ();

        bf.Serialize(fs, sm);
        fs.Close();
        Debug.Log(sm+ "Saved!");

Only I'm getting an exception- SerializationException: Type 'InfoSheet' in Assembly 'Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' is not marked as serializable. System.Runtime.Serialization.FormatterServices.InternalGetSerializableMembers (System.RuntimeType type) (at:0) System.Runtime.Serialization.FormatterServices+<>c__DisplayClass9_0.b__0 (System.Runtime.Serialization.MemberHolder _) (at:0) System.Collections.Concurrent.ConcurrentDictionary 2[TKey,TValue].GetOrAdd (TKey key, System.Func 2[T,TResult] valueFactory) (at:0) System.Runtime.Serialization.FormatterServices.GetSerializableMembers (System.Type type, System.Runtime.Serialization.StreamingContext context) (at:0) System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitMemberInfo () (at:0) System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitSerialize (System.Type objectType, System.Runtime.Serialization.ISurrogateSelector surrogateSelector, System.Runtime.Serialization.StreamingContext context, System.Runtime.Serialization.Formatters.Binary.SerObjectInfoInit serObjectInfoInit, System.Runtime.Serialization.IFormatterConverter converter, S ystem.Runtime.Serialization.SerializationBinder binder) (at:0) System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.Serialize (System.Type objectType, System.Runtime.Serialization.ISurrogateSelector surrogateSelector, System.Runtime.Serialization.StreamingContext context, System.Runtime.Serialization.Formatters.Binary.SerObjectInfoInit serObjectInfoInit, System.Runtime.Serialization.IFormatterConverter converter, System.Runtime.Serialization.SerializationBinder binder) (at:0) System.Runtime.Serialization.Formatters.Binary.ObjectWriter.WriteArray (System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo objectInfo, System.Runtime.Serialization.Formatters.Binary.NameInfo memberNameInfo, System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo memberObjectInfo) (at:0) System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Write (System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo objectInfo, System.Runtime.Serialization.Formatters.Binary.NameInfo memb erNameInfo, System.Runtime.Serialization.Formatters.Binary.NameInfo typeNameInfo) (at:0) System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Serialize (System.Object graph, System.Runtime.Remoting.Messaging.Header[] inHeaders, System.Runtime.Serialization.Formatters.Binary.__BinaryWriter serWriter, System.Boolean fCheck) (at:0) System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize (System.IO.Stream serializationStream, System.Object graph, System.Runtime.Remoting.Messaging.Header[] headers, System.Boolean fCheck) (at:0) System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize (System.IO.Stream serializationStream, System.Object graph, System.Runtime.Remoting.Messaging.Header[] headers) (at: 0) System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize (System.IO.Stream serializationStream, System.Object graph) (at:0) GigSheetManager.GetGigSheet () (at Assets/Scripts/GigSheetManager.cs:210) UnityEngine.Events.InvokableCall.Invoke () (at C:/buildslave/unity/build/Runtime/Export/UnityEvent.cs:166) UnityEngine.Events.UnityEvent.Invoke () (at C:/buildslave/unity/build/Runtime/Export/UnityEvent_0.cs:58) UnityEngine.UI.Button.Press () (at C:/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/UI/Core/Button.cs:36) UnityEngine.UI.Button.OnPointerClick (UnityEngine.EventSystems.PointerEventData eventData) (at C:/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/UI/Core/Button.cs:45) UnityEngine.EventSystems.ExecuteEvents.Execute (Unity Engine.EventSystems.IPointerClickHandler handler, UnityEngine.EventSystems.BaseEventData eventData) (at C:/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/EventSystem/ExecuteEvents.cs:50) UnityEngine.EventSystems.ExecuteEvents.Execute[T] (UnityEngine.GameObject target, UnityEngine.EventSystems.BaseEventData eventData, UnityEngine.EventSystems.ExecuteEvents+EventFunction`1[T1] functor) (at C:/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/EventSystem/ExecuteEvents.cs:261) UnityEngine.EventSystems.EventSystem:Update()

What am I missing. The string is serializing, but the list is not. Thanks in advance!

Alexander, you are right. All I had to do is to add System.Serializable to the Infosheet Class. After I did that it worked! Thanks!

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM