2014-11-08 27 views
0

(C#和Unity)我有一款遊戲已經上市,我需要通過添加新內容來更新它。我有一個包含所有保存類的列表,使用binaryformatter對其進行序列化,並在加載時對其進行反序列化並恢復數據。我有一個關於數據序列化的複雜難題

我現在遇到的問題是我正在使用內存流的ToBase64String導出來允許玩家備份他們的數據。這造成了一個無法預料的複雜情況,我無法再讓他們使用這種方法重新加載他們的數據。

我無法將新類添加到預先存在的對象列表中,或者它破壞保存的數據。 我無法將新變量添加到預先存儲的類中或破壞保存的數據。 (我明白爲什麼它在做這個想法。) 我可以使用單獨的內存流和字符串來序列化兩個對象來表示它們。然而,使用導入FromBase64String的重新加載不能使用這種方法,除非我強制玩家將二進制代碼放到不同的框中,這會混淆它們,因此它不是一個選項。

我需要知道的是,如果我忽略了一些反序列化的方式,一個包含兩個對象的序列化Base64String在加載後會同時獲得這兩個對象。問題是我只能看到一種方法來抓住第一個被保存的對象,但不是兩個。

現在改變我如何保存和加載數據爲時已晚,所以我需要以某種方式處理我已有的數據。由於我僅限於Unity和Monobehavior的可愛性,C++不是一種選擇。

我希望你能明白我在問什麼我盡力解釋它。

謝謝你的時間。

+0

我不明白。保存和備份兩個不同的東西?你序列化的兩個對象是什麼?你現在正在序列化什麼,你想要序列化什麼?改變任何事情永遠不會太遲,您可以通過在格式中添加版本號並在保存舊格式時將舊格式轉換爲新格式來以多種格式讀/寫數據。 – fejesjoco 2014-11-08 07:23:22

+0

這兩個對象是列表 savedData1和列表 savedData2。它們是包含幾個不同類對象的列表。我需要添加另一個savedData對象列表,因爲我的序列化目前只有一個。問題是,正如你可以閱讀上面關於Base64String和反序列化的那樣。 – Taiga 2014-11-08 07:41:05

+0

你說你有兩個名單,然後你說你需要添加另一個,但你只有一個。那不是第三個呢? – fejesjoco 2014-11-08 08:26:38

回答

0

好的,如果我理解正確,則需要將多個對象序列化爲一個字符串。嗯,這真的很容易,你可以序列化任何數量的對象到內存流,並且還讀回以同樣的方式:

 var bf = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter(); 
     var ms = new System.IO.MemoryStream(); 
     bf.Serialize(ms, DateTime.Now); 
     bf.Serialize(ms, "hello world"); 
     var str = Convert.ToBase64String(ms.ToArray()); 

     ms = new System.IO.MemoryStream(Convert.FromBase64String(str)); 
     var obj1 = (DateTime)bf.Deserialize(ms); 
     var obj2 = (string)bf.Deserialize(ms); 

     Console.WriteLine(obj1); 
     Console.WriteLine(obj2); 

無論如何,我想建議您實現某種形式的數據格式版本的。如果有新格式,請爲此創建新對象,並在您發佈新版本的應用時,可以以舊格式讀取數據並將其轉換爲新格式。

+0

不完全。然後,我序列化兩個List ,然後轉換內存流ToBase64String。我需要反序列化兩個列表還是以某種方式區分兩者。 – Taiga 2014-11-08 08:20:20

+0

我不明白。你讀回一個清單,這是第一個,而你讀回另一個清單,那是第二個清單。你按照你寫的順序把它們還給你。這是您可以區分的唯一方式。 – fejesjoco 2014-11-08 08:21:52

+0

我剛剛試過你說的,它確實有效。我覺得現在是最大的障礙。我不知道它是這樣工作的,但現在我知道了,我很感激你花時間幫助我認識到自己有多愚蠢(但同時教我)。你真棒! – Taiga 2014-11-08 08:34:28