简体   繁体   English

在 Unity3d 中保存二进制文件时的序列化豁免

[英]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:我在主脚本之外设置了 class :

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

}

Then the function that calls it all然后调用它的 function

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.只有我得到一个异常-SerializationException:在程序集'Assembly-CSharp,Version = 0.0.0.0,Culture = Neutral,PublicKeyToken = null'中键入'InfoSheet'未标记为可序列化。 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 System.Runtime.Serialization.FormatterServices.InternalGetSerializableMembers (System.RuntimeType 类型) (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 上下文) (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 上下文, System.Runtime.Serialization.Formatters.Binary.SerObjectInfoInit serObjectInfoInit, System.Runtime.Serialization.IFormatterConverter 转换器, 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 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 上下文, System.Runtime.Serialization.Formatters.Binary.SerObjectInfoInit serObjectInfoInit, System.Runtime.Serialization.IFormatterConverter 转换器, 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 成员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: erNameInfo, System.Runtime.Serialization.Formatters.Binary.NameInfo typeNameInfo) (at:0) System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Serialize (System.Object 图, 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[] 标头)(在: 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 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 Z0D61F8370CAD1D412F80B84D143E12/build75/buildave Runtime/Export/UnityEvent_0.cs:58) UnityEngine.UI.Button.Press () (在 C:/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/UI/Core/Button.cs:36) UnityEngine。 UI.Button.OnPointerClick (UnityEngine.EventSystems.PointerEventData eventData) (在 C:/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/UI/Core/Button.cs:45) UnityEngine.EventSystems.ExecuteEvents.Execute (统一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() Engine.EventSystems.IPointerClickHandler 处理程序,UnityEngine.EventSystems.BaseEventData eventData)(在 C:/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/EventSystem/ExecuteEvents.cs:50)UnityEngine.EventSystems.ExecuteEvents.Execute[T ](UnityEngine.GameObject 目标,UnityEngine.EventSystems.BaseEventData eventData,UnityEngine.EventSystems.ExecuteEvents+EventFunction`1[T1] 函子)(在 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.我所要做的就是将 System.Serializable 添加到 Infosheet Class。 After I did that it worked!在我这样做之后,它起作用了! Thanks!谢谢!

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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