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运行时环境用来支持用户定义类型的流化的机制。其目的是以某种存储形成使自定义对象持久化,或者将这种对象从一个地方传输到另一个地方。
- 使用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);//反序列化对象
}
- 使用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();//反序列化对象
}
- 使用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。