序列化是指將對象實例的狀態存儲到存儲媒體的過程。在此過程中,先將對象的公共字段,私有字段及類的名稱(包括類所在的程序集)裝換為字節流,然后再把字節流寫入數據流中。隨后對對象進行反序列化時,將創建出與元對象完全相同的副本。
我們要將玩家的數據保存到數據庫中,盡管不使用序列化也可以完成這項工作,但有時會很繁瑣而且容易出錯,并且在需要跟蹤對象的層次結構時,會變得越來越復雜。可以想象一下不得不為每一個對象編寫代碼,以便將屬性保存到磁盤,以及從磁盤還原這些屬性是那么麻煩。而序列化正好提供了輕松實現這個目標的快捷辦法。
要使一個類可序列化,最簡單的辦法是使用Serializable屬性對它進行標記,代碼如下:
using System;namespace Serializeable{ [Serializable] public class Player { public int coin = 0; public int money = 0; public String name= ""; }}下面給我們將要把Player類對象序列化,然后將序列化的數據保存到名為Data.bin的文件中。然后對其進行反序列化。
using System;using System.Runtime.Serialization;using System.Runtime.Serialization.Formatters.Binary;using System.IO;namespace Serializeable{ public class MainClass { public static void Main(string[] args) { Serialize (); Deserialize (); } // 序列化 public static void Serialize() { Player player = new Player (); player.coin = 1; player.money = 10; player.name = "XiaoMing"; IFormatter formatter = new BinaryFormatter (); Stream stream = new FileStream ("data.bin", FileMode.Create, Fileaccess.Write, FileShare.None); formatter.Serialize (stream, player); stream.Close (); } // 反序列化 public static void Deserialize() { IFormatter formatter = new BinaryFormatter (); Stream stream = new FileStream ("data.bin", FileMode.Open, FileAccess.Read, FileShare.Read); Player player = (Player)formatter.Deserialize (stream); stream.Close (); // 輸出驗證 Console.WriteLine("coin:{0}",player.coin); Console.WriteLine("money:{0}",player.money); Console.WriteLine("name:{0}",player.name); } }}上面代碼中先創建了Player對象,然后使用new FileStream()創建了一個名為data.bin的文件(變量stream代表了該文件)。formatter是BinaryFormatter類型實例,formatter.Serialize (stream, player)會將Player中的所有成員變量序列化成二進制數據,然后保存到stream所對應的data.bin文件中,代碼運行后,可以在程序目錄下找到data.bin文件,該文件記錄了Player的信息。 反序列化時首先創建格式化程序和流以進行讀取,然后讓格式化程序對對象進行反序列化。
新聞熱點
疑難解答