天天看點

c#面向對象程式設計——檔案操作(二)序列化和反序列化

9.1檔案讀取和寫入

檔案讀寫:讀寫文本檔案最常用的類有FileStream(檔案流)、StreamReader(流讀取器)、StreamWrite(流寫入器)。

讀寫檔案操作的基本步驟:

1、建立檔案流。

2、建立讀、寫器。

3、執行讀、寫操作。

4、關閉讀、寫器。

5、關閉檔案流。

注意:文本檔案的編碼使用UTF-8或Unicode格式。

代碼示例:

//首先添加命名空間
using System.IO;
//打開與儲存
private void 控件名_Click(object sender,EventArgs e){
//使用打開檔案對話框選擇檔案
	if(ofDlg.ShowDialog()==DialogResult.OK){
		控件名.Text=ofDlg.FileName;
		//建立檔案流FileStream("儲存的檔案名",FileMode.Open(檔案的打卡方式),FileAccess.Read(對檔案的操作權限是讀還是寫還是讀寫));
		FileStream fs=new FileStream(ofDlg.FileName,FileMode.Open,FileAccess.Read);
		//建立讀取器或者建立寫入器
		StreamReader str=new StreamReader(fs);//讀取器
		StreamWrite st=new StreamWrite(fs);//寫入器
		//讀取檔案内容或把檔案寫入文本
		控件名.Text=str.ReadToEnd();//讀取檔案内容
		st.Write(控件名.Text);//把檔案寫入文本
		//關閉寫入器或讀取器
		str.Close();//關閉寫入器
		st.Close();//關閉讀取器
		//關閉檔案流
		fs.Close();
	}
}
           

文法:

FileStream fs=new FileStream(FileName,FileMode,FileAccess);

FileName是字元串類型,表示檔案路徑。

FileMode是枚舉類型,用于指定打開檔案的方式

FileMode的枚舉值:

枚舉值 說明
CreateNew 建立新檔案,如果檔案已存在,則引發異常
Create 建立新檔案,如果檔案已存在,則覆寫
Open 打開檔案,如果檔案不存在,則引發異常
OpenOrCreate 打開檔案,如果檔案不存在,則建立新檔案
Append 打開檔案并查找大檔案尾,如果檔案不存在,則建立新檔案
Truncate 打開目前檔案并清空其内容,如果檔案不存在,則引發異常

FileAccess是枚舉類型,用于指定檔案的通路方式

FileAccess的枚舉值:

枚舉值 說明
Read 對檔案進行隻讀通路
Write 對檔案進行隻寫通路
ReadWrite 對檔案進行讀寫通路

注意:作業系統上直接建立的文本檔案預設為ANSI編碼,而StreamReader和StreamWrite預設使用UTF-8編碼而不是目前系統的ANSI編碼,是以在讀寫ANSI編碼的文本檔案時會顯示為亂碼。

StreamReader的常用方法:

方法 說明
Read() 讀取輸入流中的下一個(組)字元
ReadLine() 讀取目前流中的一行字元,并将資料作為字元串傳回
ReadToEnd() 讀取從目前位置到末尾的是以字元,并将資料作為字元串傳回
Close() 關閉StreamReader對象和基礎流,并釋放與讀取器關聯的所有系統資源

StreamWriter的常用方法:

方法 說明
Write() 将資料寫入流
WriteLine() 将行結束符之前的資料寫入流
Close() 關閉StreamWriter對象和基礎流

9.3序列化和反序列化:

概述:

序列化是指将對象執行個體的狀态存儲到存儲媒體中的過程。.NET架構通過使用反射提供自動的序列化機制。對象序列化後,類的名稱、程式集以及類執行個體化的所有資料成員均将被寫入存儲媒體中,當已序列化的對象被反序列化時,該對象将被重新建立,并自動還原所有資料成員的值,要序列化的對象需要标記為Serializable特性。

序列化與反序列化的應用:

将Customer類标記為Serializable特性,然後修改CustomerManager類中的Save()和Load()方法。

代碼執行個體:

//标記Customer類為可序列化
[Serializable]
class Cuatomer{
	private string name;
	private int age;
	private string tel;
	private string address;
	public string Name(){
		get{return name;}
		set{name=value;}
	}
	 public int Age(){
  		get{return age;}
 	 	set{age=value;}
 	}
 	public string Tel(){
  		get{return tel;}
  		set{tel=value;}
 	}
 	public string Address(){
  		get{return address;}
  		set{address=value;}
 	}
}
//修改Save()和Load()方法.
//在CustomerManager類中引用Syatem.Runtime.Serialization.Formatter.Binay命名空間
class CustomerManager{
	//儲存使用者
	public void Save(Customer customer){
		FileStream fs=new FilStream(customer.Name+".data",FileMode.Create,FlieAccess.Write);
		BinayFormatter bf=new BinaryFormatter();
		bf.Serialize(fs,customer);//序列化
		fs.Close();
	}
	//讀取使用者
	public Customer Load(string path){
		Customer customer=new Customer();
		FileStream fs=new FileStream(path,FileMode.Open,FileAccess.Read);
		BinaryFormatter bf=new BinaryFormatter();
		Cuatomer=bf.Deserialize(fs) as Customer;//反序列化
		fs.Cloae();
		return customer()
	}
}
//序列化對象後反序列化讀取并顯示資料
static void Main(string[] arfs){
	CustomerManager cm=new CustomerManager();
	Customer chen=new Customer("王五",46,"139*********","中國");
	//序列化對象
	cm.Save(chen);
	//方序列化對象
	Customer stq=cm.Load("王五.date");
	Console.WriteLine("姓名:"+stq.Name);
	Console.WriteLine("年齡:"+stq.Age);
	Console.WriteLine("電話:"+stq.Tel);
	Console.WriteLine("位址:"+stq.Address);
}