2015-08-25 42 views
0

我使用二進制格式化程序並寫入磁盤以保存我的遊戲狀態。在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上,進度將會丟失的機會非常高。我經常節省很多。

回答

1

你是否真的關閉每次刷新它的流?

您必須調用Close以確保所有數據都正確寫出到基礎流。

https://msdn.microsoft.com/en-us/library/system.io.streamwriter.close(v=vs.110).aspx

+0

我已經讀的地方,如果你使用「使用」你不需要這麼做。我會檢查這一點。 – Dvole

+0

好點,使用時應該自動調用dispose(),它應該自動調用close()。你是對的 – peterept

+0

它應該被自動調用,但由於某種原因它沒有。我確實加緊了,一切都開始工作。 – Dvole

相關問題