在很多过关的游戏中,玩家打开游戏的时候还可以从上一次关闭的游戏关卡继续进行。上一次游戏退出的级别信息一般需要两种方式进行存储:数据库和磁盘文件。
如果游戏软件本身并不大,使用数据库保存信息就显得太繁琐,而且成本很高,要玩一个小游戏,还要安装一个数据库,这样做法实在是很不值。可以采取保存到文件的做法:
保存到对象状态到文件的代码:
<span style="font-size:18px;"> public class Game//游戏类
{
private string player;
public string Player {
get { return player; }
set { player = value; }
}
private int level;
public int Level
{
get { return level; }
set { level = value; }
}
}</span>
<span style="font-size:18px;">//保存当前玩家的游戏名称和级别
private void btnExit_Click(object sender, EventArgs e)
{
Game game = new Game();
game.Player = "xiaoming";
game.Level = 2;
FileStream fs = new FileStream(@"game.bak", FileMode.OpenOrCreate, FileAccess.Write);
StreamWriter sw = new StreamWriter(fs);
sw.WriteLine(game.Player);
sw.WriteLine(game.Level);
sw.Flush();
sw.Close();
Application.Exit();
}</span>
<span style="font-size:18px;">//从文件读取上次保存的信息
private void btnLoad_Click(object sender, EventArgs e)
{
Game game = new Game();
FileStream fs = new FileStream(@"game.bak", FileMode.Open, FileAccess.Read);
StreamReader sr = new StreamReader(fs);
game.Player = sr.ReadLine();
game.Level = int.Parse(sr.ReadLine());
sr.Close();
MessageBox.Show(game.Player + "最近一次的游戏级别为:" + game.Level);
} </span>
但是这种方式在实际开发中很不合适,如果对象的属性和方法很多,这样的读写文件,不仅工作量大,而且很容易处错误,(读取的顺序要和写入的顺序保持完全一致)
.Net提供了序列化和反序列化的方法。使开发人员方便的将对象状态永久的存储到各种终端设备中,并快速的读取出来。
使用序列化和反序列化后的代码:
<span style="font-size:18px;"> [Serializable ]//序列化和反序列化的对象,其类型必须添加<span style="font-family: Arial, Helvetica, sans-serif;">[Serializable ]特性</span>
public class Game//游戏类
{
private string player;
public string Player {
get { return player; }
set { player = value; }
}
private int level;
public int Level
{
get { return level; }
set { level = value; }
}
}</span>
<span style="font-size:18px;"> //保存当前玩家的游戏名称和级别
private void btnExit_Click(object sender, EventArgs e)
{
Game game = new Game();
game.Player = "xiaoming";
game.Level = 2;
FileStream fs = new FileStream("game.bin", FileMode.Create);
BinaryFormatter formatter = new BinaryFormatter();
//使用Serialize方法将对象保存到主文件中
formatter.Serialize(fs, game);
Application.Exit();
}</span>
<span style="font-size:18px;"> //从文件读取上次保存的信息
private void btnLoad_Click(object sender, EventArgs e)
{
<span style="white-space:pre"> </span> Game game = null;
FileStream fs = new FileStream(@"game.bin", FileMode.Open, FileAccess.Read);
BinaryFormatter formatter = new BinaryFormatter();
game = (Game)formatter.Deserialize(fs);
MessageBox.Show(game.Player +"最近一次的游戏级别为:"+game.Level );
} </span>
序列化的步骤:
1.添加 using System.Runtime.Serialization.Formatters.Binary;
2.创建 文件流FileStream 对象
3.实例化 BinaryFormatter 对象
4.调用 BinaryFormatter 类的Serialize方法实现序列化
反序列化的步骤:
1.添加 using System.Runtime.Serialization.Formatters.Binary;
2.创建 文件流FileStream 对象
3.实例化 BinaryFormatter 对象
4.调用BinaryFormatter类的Deserialize方法实现反序列化