2017-06-20 105 views
0

我目前在大型項目中遇到錯誤。下面Unity C#InvalidCastException:無法從源類型轉換爲目標類型

代碼:

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 SAVEFILE。將UserData.username和UserData.userlevel分配給腳本中的變量。

我收到的錯誤是:

InvalidCastException的:無法從源類型轉換爲目標 類型。

更多細節:

LoginScript.SaveFileExists()(在 資產/腳本/帳戶系統/ LoginScript.cs:126) LoginScript.OnLoginClick()(在 資產/腳本/ AccountSystem/LoginScript.cs:104) UnityEngine.Events.InvokableCall.Invoke(System.Object [] args)(在 /Users/builduser/buildslave/unity/build/Runtime/Export/UnityEvent.cs:153) UnityEngine .Events.InvokableCallList.Invoke(System.Object [] 個參數)(在 /Users/builduser/buildslave/unity/build/Runtime/Export/UnityEvent.cs:634) UnityEngine.Events.UnityEventBase.Invoke(System.Object的[]參數) (在 /用戶/ ()(在 /Users/builduser/buildslave/unity/build/Runtime/Export/UnityEvent_0.cs: 53) UnityEngine.UI.Button.Press()(在 /Users/builduser/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/UI/Core/Button.cs:35) UnityEngine.UI.Button .OnPointerClick (UnityEngine.EventSystems.PointerEventData eventData)(位於 /Users/builduser/buildslave/unity/b uild /擴展/ guisystem/UnityEngine.UI/UI /核心/ Button.cs:44) UnityEngine.EventSystems.ExecuteEvents.Execute(IPointerClickHandler 處理程序,UnityEngine.EventSystems.BaseEventData EVENTDATA)(在 /用戶/ builduser/buildslave /團結/建造/擴展/ guisystem/UnityEngine.UI /的EventSystem/ExecuteEvents.cs:52) UnityEngine.EventSystems.ExecuteEvents.Execute [IPointerClickHandler] (UnityEngine.GameObject目標,UnityEngine.EventSystems.BaseEventData EVENTDATA,UnityEngine.EventSystems。 EventFunction`1仿函數)(在 /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

唯一的顯式轉換是'BinaryFormatter.Deserialize'鍵入'UserData'的結果。你確定這個文件是你所期望的格式嗎? –

+0

@AndyLamb我這麼認爲?你預期的格式究竟是什麼意思。類'UserData'是一個字符串'用戶名',後跟一個int'userlevel'。 – Valkarth

+0

你的Unity版本是什麼?你還可以把你的保存代碼放在你的問題中嗎? – Programmer

回答

1

解決方案:

創建另一個腳本,其中只包含:

using System.Collections; 
using System.Collections.Generic; 
using UnityEngine; 

[System.Serializable] 
class UserData{ 
    public string username; 
    public int userlevel; 
} 

並在其他腳本中刪除所有其他System.Serialize類的同名。

+0

太好了。有趣的是,如何在Unity 5.6中工作,但不在5.5中。我猜Unity已經解決了這個問題。 – Programmer

相關問題