当我保存文件时,文件已创建,但当我尝试加载时,没有加载任何内容。我觉得我就快把它弄好了。任何建议都将不胜感激。代码如下:
保存/加载类
[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;
}发布于 2013-05-10 08:21:46
我想你可能只是遇到了初始化时间的问题。
尝试要么将GameDay和冒险者的初始化移到构造函数中,要么在构造函数中消除它们的空值。一旦我执行了以下操作,代码就可以正常工作了:
public SaveLoad()
{
//GameDay = null;
//Adventurers = null;
}注我还必须确保Adventurer类具有Serialization属性。
以下是适用于我的带有序列化的代码(我必须创建自己的Adventurer类,并且我用字符串替换了日期,因为我不知道您在用它做什么,或者它来自哪里。我还用一些虚拟数据填充了冒险者列表,并注释掉了任何与表单相关的内容,但我也没有关于这些内容的信息。
[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();
}发布于 2013-05-10 08:01:24
编辑
@JasonHaley是对的,你有时间/初始化问题。
在Load按钮单击事件期间,您定义了一个名为"Load“的新SaveLoad
这将创建对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;
}https://stackoverflow.com/questions/16472777
复制相似问题