using System; …………………………………………… //匯入必要的命名空間 using System.Runtime.Serialization.Formatters.Binary; using System.Runtime.Serialization; using System.IO; namespace CustomSerialize { public partial class form1 : Form { //聲明string類型變數,用於儲存使用者確認的路徑 string fn; public form1() { InitializeComponent(); } private void form1_Load(object sender, EventArgs e) { //表單載入時,下面兩個GroupBox容器控制項不可用 this.groupBox2.Enabled = false; this.groupBox3.Enabled = false; } private void PathBtn_Click(object sender, EventArgs e) { //擷取PathTxt的Text屬性值,並賦值給fn變數和PathLabel的Text屬性值 fn = PathTxt.Text; PathLabel.Text = fn; //下面兩個GroupBox容器控制項可用 this.groupBox1.Enabled = false; this.groupBox2.Enabled = true; //第1個GroupBox容器控制項可用 this.groupBox3.Enabled = true; } private void SerBtn_Click(object sender, EventArgs e) { //建立Details類對象Dt Details Dt = new Details(); //將兩個文字框內容複寫給Dt的兩個屬性 Dt.Name = nametxt.Text; Dt.NickName = nicknametxt.Text; //建立IFormatter介面引用,來自於BinaryFormatter類對象 IFormatter Fmt = new BinaryFormatter(); //建立Stream類型引用fs,並傳遞fn作路徑參數 Stream fs = new FileStream(fn, FileMode.Create, FileAccess.Write, FileShare.None); //調用Fmt的Serialize方法,傳遞fs和Dt參數 Fmt.Serialize(fs, Dt); //關閉fs對象 fs.Close(); //輸出成功資訊 MessageBox.Show("序列化完成"); } private void DeserBtn_Click(object sender, EventArgs e) { try { //建立FileStream類型引用fs,並傳遞fn作路徑參數,檔案模式為開啟檔案 FileStream fs = new FileStream(fn, FileMode.Open); //建立BinaryFormatter類對象Fmt IFormatter Fmt = new BinaryFormatter(); //調用Fmt對象Deserialize方法,傳遞fs //將fs流中的對象轉換為Details類型,並將引用賦值給Dt Details Dt = (Details)Fmt.Deserialize(fs); //將Dt屬性值賦值給以下兩個控制項的Text屬性值 nametxtnew.Text = Dt.Name; nicknametxtnew.Text = Dt.NickName; } //捕捉並顯示檔案未找到異常 catch (FileNotFoundException ex) { string str = String.Format("異常資訊:{0}", ex.Message); MessageBox.Show(str); } } } [Serializable] //定義Details類,實現ISerializable介面 public class Details : ISerializable { string _name; string _nickname; //定義兩個公用屬性,可以讀寫相應的私人欄位 public string Name { get { return _name; } set { _name = value; } } public string NickName { get { return _nickname; } set { _nickname = value; } } public Details() { } //重載建構函式,接收兩個參數 private Details(SerializationInfo inputinfo, StreamingContext sc) { int i; //擷取"Person Name"名稱的值賦值給_name欄位 _name = inputinfo.GetString("Person Name"); //擷取_name欄位內容中'>'字元索引值加1的整數值 i = _name.IndexOf('>') + 1; //截取索引i開始的字串內容,並賦值給_name欄位 _name = _name.Substring(i); //擷取"Person Name"名稱的值賦值給_name欄位 _nickname = inputinfo.GetString("Person NickName"); //擷取_name欄位內容中'>'字元索引值加1的整數值 i = _nickname.IndexOf('>') + 1; //截取索引i開始的字串內容,並賦值給_nickname欄位 _nickname = _nickname.Substring(i); } //實現ISerializable介面的GetObjectData方法,接收兩個參數 void ISerializable.GetObjectData(SerializationInfo outputinfo, StreamingContext sc) { //修改所需序列化的欄位值,並修改名稱,填充到outputinfo對象 outputinfo.AddValue("Person Name", "The boy's name is -->" + _name); outputinfo.AddValue("Person NickName", "The boy's nickname is -->" + _nickname); } } } |