2013-05-09 41 views
0

我一直在下面的二進制序列化的指導(這一個位置:http://www.codeproject.com/Articles/1789/Object-Serialization-using-C),我想我終於幾乎都有它的工作。當我保存文件被創建時,但是當我嘗試加載時,沒有任何內容被加載。我覺得我正在接近這個工作。任何意見,將不勝感激。下面的代碼:二進制序列化,我覺得我幾乎有工作

保存/載入類

[Serializable()] 
public class SaveLoad : ISerializable 
{ 
    public int GameDay = Date.GameDay; 
    public List<Adventurer> Adventurers = FormMain.AdventurerManager.AdventurerList; 

    public SaveLoad() 
    { 
     GameDay = 0; 
     Adventurers = null; 
    } 

    public SaveLoad(SerializationInfo info, StreamingContext ctxt) 
    { 
     GameDay = (int)info.GetValue("Date", typeof(int)); 
     Adventurers = (List<Adventurer>)info.GetValue("Adventurers", typeof(List<Adventurer>)); 
    } 

    public void GetObjectData(SerializationInfo info, StreamingContext ctxt) 
    { 
     info.AddValue("Date", GameDay); 
     info.AddValue("Adventurers", Adventurers); 
    } 
} 

保存/載入方法:

void btnSaveGame_Click(object sender, EventArgs e) 
    { 
     SaveLoad save = new SaveLoad(); 

     Stream stream = File.Open("SaveGame.osl", FileMode.Create); 
     BinaryFormatter bformatter = new BinaryFormatter(); 

     bformatter.Serialize(stream, save); 
     stream.Close(); 
    } 

    void btnLoadGame_Click(object sender, EventArgs e) 
    { 
     SaveLoad load = new SaveLoad(); 

     Stream stream = File.Open("SaveGame.osl", FileMode.Open); 
     BinaryFormatter bformatter = new BinaryFormatter(); 

     load = (SaveLoad)bformatter.Deserialize(stream); 
     stream.Close(); 

     Date.CalculateDate(); 

     this.Visible = false; 
     ((FormMain)(this.ParentForm)).ControlMainScreen.Visible = true; 
    } 
+0

你明白'null'?還是你得到一個例如既'GameDay'和'Adventurers'是'null'?我注意到,當你裝,你創建SaveLoad'的'一個新的實例,但幾行做了你再創建一個由反序列化。Perhapse你在錯誤的實例看? – 2013-05-09 23:30:52

+0

我想那是案子。在教程中,GetObjectData從不被調用,我猜這就是錯誤。它需要發生什麼工作? – 2013-05-09 23:31:15

+0

@MartinMulder當我點擊加載遊戲按鈕時,屏幕會回到主屏幕,但這就是發生的一切。 Load不做任何事情或保存不正確保存。 – 2013-05-09 23:54:55

回答

1

我想你可能只是有一個初始化時序問題。

嘗試或者移動你的比賽日和冒險家的初始化構造函數或擺脫在構造函數中的歸零出來的。一旦我做了以下的代碼非常作品:

public SaveLoad() 
{ 
    //GameDay = null; 
    //Adventurers = null; 
} 

注意我只好也確保冒險家類有序列化屬性。

這裏是序列化的代碼適用於我(我不得不創建我自己的冒險家類,我用一個字符串替換日期,因爲我無法弄清楚你在做什麼或它在哪裏來從我還填充了一些虛擬數據冒險家列表,並註釋掉什麼關係,我也並沒有對信息的形式的東西。

[Serializable()] 
public class SaveLoad : ISerializable 
{ 
    public string GameDay = null; 
    public List<Adventurer> Adventurers = null; 
     //FormMain.AdventurerManager.AdventurerList; 

    public SaveLoad() 
    { 
     GameDay = "Date"; 
     Adventurers = new List<Adventurer>() { new Adventurer { Name = "a1", Type = "t1" }, new Adventurer { Name = "a1", Type = "t1" } }; ; 
    } 

    public SaveLoad(SerializationInfo info, StreamingContext ctxt) 
    { 
     GameDay = (string)info.GetValue("Date", typeof(string)); 
     Adventurers = (List<Adventurer>)info.GetValue("Adventurers", typeof(List<Adventurer>)); 
    } 

    public void GetObjectData(SerializationInfo info, StreamingContext ctxt) 
    { 
     info.AddValue("Date", GameDay); 
     info.AddValue("Adventurers", Adventurers); 
    } 
} 
[Serializable()] 
public class Adventurer 
{ 
    public string Name { get; set; } 
    public string Type { get; set; } 
} 

private void btnLoadGame_Click(object sender, EventArgs e) 
    { 
     SaveLoad sl = new SaveLoad(); 

     Stream stream = File.Open("SaveGame.osl", FileMode.Open); 
     BinaryFormatter bformatter = new BinaryFormatter(); 

     sl = (SaveLoad)bformatter.Deserialize(stream); 
     stream.Close(); 

     MessageBox.Show(sl.Adventurers.Count.ToString()); 
     //Date.CalculateDate(); 

     //this.Visible = false; 
     //((Form1)(this.ParentForm)).ControlMainScreen.Visible = true; 

    } 

    private void btnSaveGame_Click(object sender, EventArgs e) 
    { 
     SaveLoad sl = new SaveLoad(); 

     Stream stream = File.Open("SaveGame.osl", FileMode.Create); 
     BinaryFormatter bformatter = new BinaryFormatter(); 

     bformatter.Serialize(stream, sl); 
     stream.Close(); 

    } 
+0

我試過這樣做,仍然沒有。 – 2013-05-10 00:32:37

+0

當你像這樣初始化構造函數之外的字段時,它們會被編譯到構造函數的前幾行中 - 這意味着它們會在你將它們設置爲null和0之前被添加。所以你需要刪除那些2來自構造函數的行。 – 2013-05-10 00:50:28

0

編輯

@JasonHaley是正確的,你有一個定時/初始化問題。

在你定義了一個名爲「裝載」新SaveLoad您Load按鈕單擊事件

這造成對FormMain.AdventurerManager.AdventurerList

但反序列化過程的引用此引用是用一個對象銷燬序列化到磁盤(冒險家的其他列表),現在在你的FormMain.AdventurerManager.AdventurerList定義

你需要加載到該列表特別是一個冒險家的不同列表...

void btnLoadGame_Click(object sender, EventArgs e) 
{ 
    Stream stream = File.Open("SaveGame.osl", FileMode.Open); 
    BinaryFormatter bformatter = new BinaryFormatter(); 

    SaveLoad load = (SaveLoad)bformatter.Deserialize(stream); 
    // *********************************** 
    FormMain.AdventurerManager.AdventurerList = SaveLoad.Adventurers 
    // *********************************** 

    stream.Close(); 

    Date.CalculateDate(); 

    this.Visible = false; 
    ((FormMain)(this.ParentForm)).ControlMainScreen.Visible = true; 
} 
+0

你能更具體一點嗎?我不是一個有經驗的程序員,但我真的在這裏嘗試。 – 2013-05-10 00:26:25