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);
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值