我使用二進制格式化程序並寫入磁盤以保存我的遊戲狀態。在iOS上,這個功能完美無缺,完全沒有問題。序列化到磁盤有時在Android上失敗,但在iOS上工作正常(Unity3d)
另一方面在Android上失敗。失去了進展,失去了兩個變量,另外兩個被拯救了,一切都變得焦躁不安。
可能是我的問題?下面是序列化的代碼/反序列化:
// path to file
private static string saveFileName = "047.bin";
// Deserialization function
public GlobalState(SerializationInfo info, StreamingContext ctxt)
{
lastBossKilled = (int)info.GetValue("lastBoss", typeof(int));
currentlySelectedSpells = (SpellType[])info.GetValue("spells", typeof(SpellType[]));
learnedTalents = (int[])info.GetValue("talents", typeof(int[]));
talentPointsAvailable = (int)info.GetValue("talentPoints", typeof(int));
}
//Serialization function.
public void GetObjectData(SerializationInfo info, StreamingContext ctxt)
{
info.AddValue("lastBoss", lastBossKilled);
info.AddValue("spells", currentlySelectedSpells);
info.AddValue("talents", learnedTalents);
info.AddValue("talentPoints", talentPointsAvailable);
}
這裏是加載和保存狀態代碼:
public void SaveState()
{
using (StreamWriter sw = new StreamWriter(Application.persistentDataPath + "/" + saveFileName)) {
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(sw.BaseStream, this);
}
}
public static GlobalState LoadState()
{
try {
using (StreamReader sr = new StreamReader(Application.persistentDataPath + "/" + saveFileName)) {
BinaryFormatter bf = new BinaryFormatter();
GlobalState result = (GlobalState)bf.Deserialize(sr.BaseStream);
return result;
}
} catch (Exception e) {
return null;
}
}
,這裏是如果負載返回null時調用構造函數:
private GlobalState()
{
lastBossKilled = -1;
currentlySelectedSpells = new SpellType[] { SpellType.SlowHeal, SpellType.Renew, SpellType.None, SpellType.None };
learnedTalents = new int[] { 0, 0, 0, 0, 0, 0, 0, 0 };
talentPointsAvailable = 0;
}
問題:lastBossKilled有時候沒有得到保存,目前選擇由於某種原因,有些事情在開始時有另一個咒語(我覺得lastBossKilled被解析爲curre ntlySelectedSpells),talentPointsAvailable沒有得到保存。
再次,在iOS上,這工作得很好。在我殺了應用程序後,在Android上,進度將會丟失的機會非常高。我經常節省很多。
我已經讀的地方,如果你使用「使用」你不需要這麼做。我會檢查這一點。 – Dvole
好點,使用時應該自動調用dispose(),它應該自動調用close()。你是對的 – peterept
它應該被自動調用,但由於某種原因它沒有。我確實加緊了,一切都開始工作。 – Dvole