如何串行化数据
本例说明了如何使用XmlSerializer 类将一个自定义类中的数据写到游戏存档中,还有如何从串行化的文件中加载这些数据。源代码下载.
串行化数据
定义游戏存档数据
-
定义一个新的类或者结构。
这个类所占的字节数大小将决定你的保存文件的字节数大小,所以,尽量使这个类占用的空间越小越好。不要在这个类中使用其他的类,除非你想将这些使用了的类也串行化(serialize)。
-
给这个类添加Serializable属性。
[Serializable] public struct SaveGameData { public string PlayerName; public Vector2 AvatarPosition; public int Level; public int Score; }
串行化数据到游戏存档文件
-
创建一个访问指定设备的StorageContainer 类。
-
使用Path.Combine 方法创建一个指定游戏存档文件全路径名的字符串。
-
使用System.IO命名空间中的File.Open 方法创建这个文件的 FileStream 对象。
在 Open 方法中指定 FileMode.OpenOrCreate 参数,这表示如果游戏存档文件不存在的话就新建一个。
-
创建一个XmlSerializer 对象,将你定义的游戏存档数据的结构类型作为参数传递给这个对象的构造函数。
-
调用Serialize方法,传递FileStream 对象和要串行化的数据。
这个XmlSerializer 对象将使用FileStream 对象将数据写入文件,并将在结构上将这个数据转化为一个XML。
-
关闭FileStream。
-
关闭StorageContainer 并将变化传递给设备。
private static void DoSaveGame(StorageDevice device) { // Create the data to save. SaveGameData data = new SaveGameData(); data.PlayerName = "Hiro"; data.AvatarPosition = new Vector2(360, 360); data.Level = 11; data.Score = 4200; // Open a storage container. StorageContainer container = device.OpenContainer("StorageDemo"); // Get the path of the save game. string filename = Path.Combine(container.Path, "savegame.sav"); // Open the file, creating it if necessary. FileStream stream = File.Open(filename, FileMode.OpenOrCreate); // Convert the object to XML data and put it in the stream. XmlSerializer serializer = new XmlSerializer(typeof(SaveGameData)); serializer.Serialize(stream, data); // Close the file. stream.Close(); // Dispose the container, to commit changes. container.Dispose(); }
从一个游戏存档文件中读取串行化数据
-
创建一个访问指定设备的StorageContainer 类。
-
使用Path.Combine 方法创建要读取的游戏存档文件全路径名的字符串。
-
调用File.Exists 方法来确认这个游戏存档文件是否存在。
-
使用System.IO命名空间中的File.Open 方法创建这个要读取的文件的 FileStream 对象。
-
创建一个XmlSerializer 对象,将你定义的游戏存档数据的结构类型作为参数传递给这个对象的构造函数。
-
调用Deserialize方法, 传递FileStream 对象。
Deserialize 方法将返回你保存在游戏存档文件中的自定义类的实例的拷贝。 (你需要将他们的返回值使用强制类型转换将返回值转换为你的自定义对象的类型)。
-
关闭FileStream。
-
关闭StorageContainer。
发布时间:2009/3/3 下午12:00:49 阅读次数:6877