C# IO和Serialize

24 篇文章 0 订阅

C# IO和Serialize

System.IO 命名空间包含允许读写文件和数据流的类型以及提供基本文件和目录支持的类型。

	// 判断文件夹是否存在
	Directory.Exists(filePath)
	
	// 文件夹的创建
	DirectoryInfo directoryInfo = Directory.CreateDirectory(filePath);//一次性创建全部的子路径
    Directory.Move(filePath, fileMovePath);//移动  原文件夹就不在了
    Directory.Delete(fileMovePath);//删除

	// 文件的四种创建方式
	Directory.CreateDirectory(LogPath);//创建了文件夹之后,才能创建里面的文件
	// 1.打开文件流 (创建文件并写入)
    using (FileStream fileStream = File.Create(fileName))
    {
        string name = "12345567778890";
        byte[] bytes = Encoding.Default.GetBytes(name);
        fileStream.Write(bytes, 0, bytes.Length);
        fileStream.Flush();
    }
    // 2.打开文件流 (创建文件并写入)
    using (FileStream fileStream = File.Create(fileName))
    {
        StreamWriter sw = new StreamWriter(fileStream);
        sw.WriteLine("1234567890");
        sw.Flush();
    }
	// 3.流写入器(创建/打开文件并写入)
    using (StreamWriter sw = File.AppendText(fileName))
    {
        string msg = "今天是Course6IOSerialize";
        sw.WriteLine(msg);
        sw.Flush();
    }
    // 4.流写入器(创建/打开文件并写入)
    using (StreamWriter sw = File.AppendText(fileName))
    {
        string name = "0987654321";
        byte[] bytes = Encoding.Default.GetBytes(name);
        sw.BaseStream.Write(bytes, 0, bytes.Length);
        sw.Flush();
    }
	
	// 获取盘符信息
	DriveInfo[] drives = DriveInfo.GetDrives();

序列化又称串行化,是.NET运行时环境用来支持用户定义类型的流化的机制。其目的是以某种存储形成使自定义对象持久化,或者将这种对象从一个地方传输到另一个地方。

  1. 使用BinaryFormatter进行串行化。
	//使用二进制序列化对象
	//文件名称与路径
	string fileName = Path.Combine(Constant.SerializeDataPath, @"BinarySerialize.txt");
	using (Stream fStream = new FileStream(fileName, FileMode.Create, FileAccess.ReadWrite))
	{
	    //需要一个stream,这里是直接写入文件了
	    List<Programmer> pList = DataFactory.BuildProgrammerList();// 自定义获取数据方法
	    BinaryFormatter binFormat = new BinaryFormatter();//创建二进制序列化器
	    binFormat.Serialize(fStream, pList);
	}
	
	// 在反序列化
	using (Stream fStream = new FileStream(fileName, FileMode.Open, FileAccess.ReadWrite))
	{
	    //需要一个stream,这里是来源于文件
	    BinaryFormatter binFormat = new BinaryFormatter();//创建二进制序列化器
	    //使用二进制反序列化对象
	    fStream.Position = 0;//重置流位置
	    List<Programmer> pList = (List<Programmer>)binFormat.Deserialize(fStream);//反序列化对象
	}
  1. 使用SoapFormatter进行串行化。使用XmlSerializer进行串行化
	//使用Soap序列化对象
	//文件名称与路径
	string fileName = Path.Combine(Constant.SerializeDataPath, @"SoapSerialize.txt");
	using (Stream fStream = new FileStream(fileName, FileMode.Create, FileAccess.ReadWrite))
	{
	    List<Programmer> pList = DataFactory.BuildProgrammerList();// 自定义获取数据方法
	    SoapFormatter soapFormat = new SoapFormatter();//创建二进制序列化器
	    //soapFormat.Serialize(fStream, list);//SOAP不能序列化泛型对象
	    soapFormat.Serialize(fStream, pList.ToArray());
	}
	
	// 在反序列化
	using (Stream fStream = new FileStream(fileName, FileMode.Open, FileAccess.ReadWrite))
	{
	    SoapFormatter soapFormat = new SoapFormatter();//创建二进制序列化器
	    //使用二进制反序列化对象
	    fStream.Position = 0;//重置流位置
	    List<Programmer> pList = ((Programmer[])soapFormat.Deserialize(fStream)).ToList();//反序列化对象
	}
  1. 使用XmlSerializer进行串行化。
	//使用XML序列化对象
	//文件名称与路径
	string fileName = Path.Combine(Constant.SerializeDataPath, @"Student.xml");
	using (Stream fStream = new FileStream(fileName, FileMode.Create, FileAccess.ReadWrite))
	{
	    List<Programmer> pList = DataFactory.BuildProgrammerList();// 自定义获取数据方法
	    XmlSerializer xmlFormat = new XmlSerializer(typeof(List<Programmer>));//创建XML序列化器,需要指定对象的类型
	    xmlFormat.Serialize(fStream, pList);
	}
	using (Stream fStream = new FileStream(fileName, FileMode.Open, FileAccess.ReadWrite))
	{
	    XmlSerializer xmlFormat = new XmlSerializer(typeof(List<Programmer>));//创建XML序列化器,需要指定对象的类型
	    //使用XML反序列化对象
	    fStream.Position = 0;//重置流位置
	    List<Programmer> pList = pList = (List<Programmer>)xmlFormat.Deserialize(fStream);
	}

综合上述三种序列化器:
1.SOAP不能序列化泛型对象,需要转成数组之类的。
2.BinaryFormatter序列化自定义类的对象时,序列化之后的流中带有空字符,以致于无法反序列化,反序列化时总是报错“在分析完成之前就遇到流结尾”(已经调用了stream.Seek(0, SeekOrigin.Begin);)。
3.改用XmlFormatter序列化之后,可见流中没有空字符,从而解决上述问题,但是要求类必须有无参数构造函数,而且各属性必须既能读又能写,即必须同时定义getter和setter,若只定义getter,则反序列化后的得到的各个属性的值都为null。

此外还有常用的json序列化器:Newtonsoft.Json

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值