我目前在大型项目中遇到错误。
以下代码:
public void SaveFileExists(){
Debug.Log ("SaveFileExists was called.");
//GameObject.Find ("_Scripts").GetComponent<SaveGame> ().Load ();
UserData userdata = null;
//Creating a new BinaryFormatter
BinaryFormatter bf = new BinaryFormatter ();
//Making a file which now contains the Un-Serialized File
FileStream file = File.Open (Application.persistentDataPath + ("/UserData." + accountLoginAttempt), FileMode.Open);
//Assigning the values of the saved file to the new file
//UserData newData = (UserData)bf.Deserialize (file);
userdata = bf.Deserialize(file) as UserData;
//Assigning the values from the save file to the variables in this script.
accountLoginAttempt = userdata.username;
accountLevel = userdata.userlevel;
//Assinging the values from this script to the _PlayerManager script. (This is where the UI gets it's info).
GameObject.Find ("_AccountInfoSaveHolder").GetComponent<HoldInfo> ().UserInfo = accountLoginAttempt;
GameObject.Find ("_AccountInfoSaveHolder").GetComponent<HoldInfo> ().UserLevel = accountLevel;
errortext.text = "Login Successful.";
Canvas.ForceUpdateCanvases ();
}
序列化字段也位于以下位置:
[System.Serializable]
class UserData{
public string username;
public int userlevel;
}
我正在尝试加载存储在Application.persistentDataPath中的保存文件。将UserData.username和UserData.userlevel分配给我的脚本中的变量。
我收到的错误是:
InvalidCastException:无法从源类型转换为目标 类型。
更多详情:
LoginScript.SaveFileExists()(at 资产/脚本/帐户系统/ LoginScript.cs:126) LoginScript.OnLoginClick()(at 资产/脚本/帐户系统/ LoginScript.cs:104) UnityEngine.Events.InvokableCall.Invoke(System.Object [] args)(at /Users/builduser/buildslave/unity/build/Runtime/Export/UnityEvent.cs:153) UnityEngine.Events.InvokableCallList.Invoke(System.Object [] 参数)(at /Users/builduser/buildslave/unity/build/Runtime/Export/UnityEvent.cs:634) UnityEngine.Events.UnityEventBase.Invoke(System.Object []参数) (在 /Users/builduser/buildslave/unity/build/Runtime/Export/UnityEvent.cs:769) UnityEngine.Events.UnityEvent.Invoke()(at /Users/builduser/buildslave/unity/build/Runtime/Export/UnityEvent_0.cs:53) UnityEngine.UI.Button.Press()(at /Users/builduser/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/UI/Core/Button.cs:35) UnityEngine.UI.Button.OnPointerClick (UnityEngine.EventSystems.PointerEventData eventData)(at /Users/builduser/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/UI/Core/Button.cs:44) UnityEngine.EventSystems.ExecuteEvents.Execute(IPointerClickHandler handler,UnityEngine.EventSystems.BaseEventData eventData)(at /Users/builduser/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/EventSystem/ExecuteEvents.cs:52) UnityEngine.EventSystems.ExecuteEvents.Execute [IPointerClickHandler] (UnityEngine.GameObject目标,UnityEngine.EventSystems.BaseEventData eventData,UnityEngine.EventSystems.EventFunction`1仿函数)(at /Users/builduser/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/EventSystem/ExecuteEvents.cs:269) UnityEngine.EventSystems.EventSystem:更新()
编辑:
SaveGame.cs:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;
using UnityEngine.SceneManagement;
public class SaveGame : MonoBehaviour {
//Saved Variables
[Header("Saved Variables")]
public string savedname;
public string attemptedlogin;
public int savedlevel;
//Loaded Variables
[Header("Loaded Variables")]
public string loadedname;
public int loadedlevel;
public void Awake(){
if (SceneManager.GetActiveScene ().name == "GameScene") {
Load ();
}
}
public void Save(){
savedname = GameObject.Find ("_Scripts").GetComponent<PlayerManager> ().PlayerName;
savedlevel = GameObject.Find ("_Scripts").GetComponent<PlayerManager> ().UserLevel;
BinaryFormatter bf = new BinaryFormatter();
FileStream file = File.Open(Application.persistentDataPath + ("/UserData." + savedname), FileMode.Create);
UserData newData = new UserData();
newData.username = savedname;
newData.userlevel = savedlevel;
bf.Serialize(file, newData);
file.Close();
}
}
我还在整个脚本中删除了所有System.Serializable类,并创建了一个名为UserDataSerialize.cs的脚本,其中包含:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[System.Serializable]
class UserData{
public string username;
public int userlevel;
}
现在我得到的错误是:
TypeLoadException: Could not load type 'SaveGame+UserData'.
System.Reflection.Assembly.GetType (System.String name, Boolean throwOnError, Boolean ignoreCase) (at /Users/builduser/buildslave/mono/build/mcs/class/corlib/System.Reflection/Assembly.cs:398)
System.Reflection.Assembly.GetType (System.String name, Boolean throwOnError) (at /Users/builduser/buildslave/mono/build/mcs/class/corlib/System.Reflection/Assembly.cs:381)
System.Runtime.Serialization.Formatters.Binary.ObjectReader.GetDeserializationType (Int64 assemblyId, System.String className) (at /Users/builduser/buildslave/mono/build/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/ObjectReader.cs:833)
System.Runtime.Serialization.Formatters.Binary.ObjectReader.ReadTypeMetadata (System.IO.BinaryReader reader, Boolean isRuntimeObject, Boolean hasTypeInfo) (at /Users/builduser/buildslave/mono/build/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/ObjectReader.cs:637)
System.Runtime.Serialization.Formatters.Binary.ObjectReader.ReadObjectInstance (System.IO.BinaryReader reader, Boolean isRuntimeObject, Boolean hasTypeInfo, System.Int64& objectId, System.Object& value, System.Runtime.Serialization.SerializationInfo& info) (at /Users/builduser/buildslave/mono/build/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/ObjectReader.cs:269)
System.Runtime.Serialization.Formatters.Binary.ObjectReader.ReadObject (BinaryElement element, System.IO.BinaryReader reader, System.Int64& objectId, System.Object& value, System.Runtime.Serialization.SerializationInfo& info) (at /Users/builduser/buildslave/mono/build/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/ObjectReader.cs:195)
System.Runtime.Serialization.Formatters.Binary.ObjectReader.ReadObject (BinaryElement element, System.IO.BinaryReader reader, System.Int64& objectId, System.Object& value, System.Runtime.Serialization.SerializationInfo& info) (at /Users/builduser/buildslave/mono/build/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/ObjectReader.cs:223)
System.Runtime.Serialization.Formatters.Binary.ObjectReader.ReadNextObject (BinaryElement element, System.IO.BinaryReader reader) (at /Users/builduser/buildslave/mono/build/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/ObjectReader.cs:130)
System.Runtime.Serialization.Formatters.Binary.ObjectReader.ReadObjectGraph (BinaryElement elem, System.IO.BinaryReader reader, Boolean readHeaders, System.Object& result, System.Runtime.Remoting.Messaging.Header[]& headers) (at /Users/builduser/buildslave/mono/build/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/ObjectReader.cs:104)
System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.NoCheckDeserialize (System.IO.Stream serializationStream, System.Runtime.Remoting.Messaging.HeaderHandler handler) (at /Users/builduser/buildslave/mono/build/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/BinaryFormatter.cs:179)
System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize (System.IO.Stream serializationStream) (at /Users/builduser/buildslave/mono/build/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/BinaryFormatter.cs:136)
LoginScript.SaveFileExists () (at Assets/Scripts/AccountSystem/LoginScript.cs:111)
LoginScript.OnLoginClick () (at Assets/Scripts/AccountSystem/LoginScript.cs:84)
UnityEngine.Events.InvokableCall.Invoke (System.Object[] args) (at /Users/builduser/buildslave/unity/build/Runtime/Export/UnityEvent.cs:153)
UnityEngine.Events.InvokableCallList.Invoke (System.Object[] parameters) (at /Users/builduser/buildslave/unity/build/Runtime/Export/UnityEvent.cs:634)
UnityEngine.Events.UnityEventBase.Invoke (System.Object[] parameters) (at /Users/builduser/buildslave/unity/build/Runtime/Export/UnityEvent.cs:769)
UnityEngine.Events.UnityEvent.Invoke () (at /Users/builduser/buildslave/unity/build/Runtime/Export/UnityEvent_0.cs:53)
UnityEngine.UI.Button.Press () (at /Users/builduser/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/UI/Core/Button.cs:35)
UnityEngine.UI.Button.OnPointerClick (UnityEngine.EventSystems.PointerEventData eventData) (at /Users/builduser/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/UI/Core/Button.cs:44)
UnityEngine.EventSystems.ExecuteEvents.Execute (IPointerClickHandler handler, UnityEngine.EventSystems.BaseEventData eventData) (at /Users/builduser/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/EventSystem/ExecuteEvents.cs:52)
UnityEngine.EventSystems.ExecuteEvents.Execute[IPointerClickHandler] (UnityEngine.GameObject target, UnityEngine.EventSystems.BaseEventData eventData, UnityEngine.EventSystems.EventFunction`1 functor) (at /Users/builduser/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/EventSystem/ExecuteEvents.cs:269)
UnityEngine.EventSystems.EventSystem:Update()
答案 0 :(得分:1)
解决方案:
创建另一个仅包含以下内容的脚本:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[System.Serializable]
class UserData{
public string username;
public int userlevel;
}
并在其他脚本中删除所有其他同名的System.Serialize类。
答案 1 :(得分:0)
也许不是每个人都遇到问题,但这对我有所帮助:在构建保存结构的过程中,我首先保存了一种类型的对象,然后又切换到另一种对象。我的游戏准备在有机会保存之前加载,因此我正在加载旧类,而没有用新类保存它。通过禁用负载,转弯游戏,保存并重新打开负载,我能够解决此问题。