接着上篇的来  System.IO

FileSystemWatcher

   指向这个签名的方法

  可以监听目录发生了什么事件

例如:

  1. static void Main(string[] args)
  2. {
  3. Console.WriteLine("请开始你的表演:");
  4. FileSystemWatcher watcher = new FileSystemWatcher();
  5. watcher.Path = @"E:\Test"; //此目录一定需要存在,不然会引发 ArgumentException 异常
  6. //设置需要 留意 的事情
  7. watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName;
  8. //只观察文本文件
  9. watcher.Filter = "*.txt";
  10. //添加事件处理程序
  11. watcher.Changed += new FileSystemEventHandler(Onchange);
  12. watcher.Created += new FileSystemEventHandler(Onchange);
  13. watcher.Deleted += new FileSystemEventHandler(Onchange);
  14. watcher.Renamed += new RenamedEventHandler(OnRenamed);
  15. //开始观察目录
  16. watcher.EnableRaisingEvents = true;
  17. //等待用户退出程序
  18. Console.WriteLine("请按 `q` 退出程序");
  19. while (Console.Read() !='q');
  20. }
  21. static void Onchange(object source, FileSystemEventArgs e)
  22. {
  23. //指定当文件改变、创建或者删除的时候需要做的事情
  24. Console.WriteLine("File:{0} {1}",e.FullPath,e.ChangeType);
  25. }
  26. static void OnRenamed(object source, RenamedEventArgs e)
  27. {
  28. //指定当文件重命名的时候需要做的事情
  29. Console.WriteLine("File: {0} renamed to {1}",e.OldFullPath,e.FullPath);
  30. }

对象序列化

序列化描述了持久化一个对象的状态到流(如文件流和内存流)的过程。序列化服务保存应用程序数据相对于IO命名空间的读读取器/编写器,减少了很多的麻烦。

在看列子之前,你先要理解一个类。

  1. [Serializable] //序列化的对象需要标记为可以序列化
  2. public class UserProp
  3. {
  4. public string WindowColor;
  5. public int FontSize;
  6. }
  7.  
  8. Console.WriteLine("请开始你的表演:");
  9. UserProp userData = new UserProp();
  10. userData.WindowColor = "red";
  11. userData.FontSize = ;
  12.  
  13. //将一个对象保存到一个本地
  14. BinaryFormatter binFormat = new BinaryFormatter();
  15. using (Stream fStrem=new FileStream("Haha.txt", FileMode.Create, FileAccess.Write, FileShare.None))
  16. {
  17. binFormat.Serialize(fStrem,userData); //将对象序列化为流
  18. }
  19. Console.ReadLine();

虽然对象序列化保存对象非常简单,单幕后的调用过程非常复杂。除了保存为二进制格式外还可以保存为简单对象访问协议(SOAP)或XML格式。

最后要知道对象图可以持久化为任意的System.IO.Stream派生类型。

一组关联对象(包括基类和派生类)被总称为一个对象图。对象图提供一种很简明的方式来记载一组对象如何相互引用对方。

为序列化配置对象

为每个一个关联 的类(或结构)加上 [serializable] 特性,不参与到序列化配置中,可以在这么域前面加上 [NoSerialized]特性。

定义可序列化对象

  1. [Serializable]
  2. public class Radio
  3. {
  4. public bool hasTweeters;
  5. public bool hasSubWoofers;
  6.  
  7. [NonSerialized] //把此变量设置为不可序列化的
  8. public string radioID = "X-Y110";
  9. }
  10.  
  11. [Serializable]
  12. public class Car
  13. {
  14. public Radio theRadio = new Radio();
  15. public bool isHatchBack;
  16. }
  17.  
  18. [Serializable]
  19. public class JamesBondCar : Car
  20. {
  21. public bool canFly;
  22. public bool canSubmerge;
  23. }

注:[Serializable]特性不能被继承。因此,如果从被标记为[Serializable]的类派生一个类,子类也必须被标记为[Serializable],否则它不能持久化。

有一句话叫做公共的属性,私有的字段

一般的情况,是在一个类中,我们把字段定义为私有的,属性则定义为公共的。这句的来源则是我们在一个类中声明一个字段,然后把这个字段进行重构,封装字段。

  1. [Serializable]
  2. public class Person
  3. {
  4. //公共字段
  5. public bool isAlive = true;
  6.  
  7. //私有字段
  8. private int personAge = ;
  9.  
  10. //公共属性,私有字段
  11. private string fName;
  12. public string FName
  13. {
  14. get { return fName; }
  15. set { fName = value; }
  16. }

我们使用 BinaryFormatter或 SoapFormatter进行处理,都可以保存到所选的流中。然而,XmLSerializer不会保存personAge的值。

序列化格式方法

一旦将类型配置为参与.NET序列化,接下来就是选择当持久化对象图时使用哪种格式(二进制、SOAP或XML),有以下3中选择:

BinaryFormatter:

SoapFormatter:

XmlSerializer:

在引用不出命名空间的时候请去引用里面添加引用。

第一个上面说过了,是二进制格式。

这里我们可以了解下它的属性和方法,主要是序列化和反序列化的方法。SOAP是一个标准的XML格式。

有很的重载构造函数。

下面会介绍如何使用这三种格式序列化对象。

这三个都市直接派生于System.Object.

IFormatter和IremotingFormatting接口

我们来看看IFormatter接口

它们两个类继承同一个接口,而此接口中这两个主要的方法刚好符合我们的要求 。所有我们建立一个方法使用这两个类中的一个来序列化一个对象图。

  1. /// <summary>
  2. /// 两个类的通用方法
  3. /// </summary>
  4. /// <param name="itfFormat">BinaryFormatter或SoapFormatter的实例</param>
  5. /// <param name="destStrem">准备的Stream流</param>
  6. /// <param name="graph">需要写的序列化对象</param>
  7. static void SerializeObjectGraph(IFormatter itfFormat, Stream destStrem, object graph)
  8. {
  9. itfFormat.Serialize(destStrem,graph);
  10. }

在格式化程序中的类型保真

在3种格式化程序中,最明显不同是对象图被持久化为不同的流(二进制、SOAP或XML)的方式。BinaryFormatter在希望用值(例如以一个完整的副本)跨越.NET应用程序机器边界传递对象时成为理想的选择。当希望尽可能延伸持久化对象图的使用范围时,SoapFormatter和XmlSerializer是理想选择。

①使用BinaryFormatter序列化对象

Ⅰ Serialize():将一个对象图按字节顺序转化为一个对象图。

Ⅱ Deserialize():讲一个持久化的字节顺序转化为一个对象图。

  1. static void Main(string[] args)
  2. {
  3. Console.WriteLine("请开始你的表演:");
  4.  
  5. JamesBondCar jbc = new JamesBondCar();
  6. jbc.canFly = true;
  7. jbc.canSubmerge = false;
  8. jbc.theRadio.stationPresets = new double[] { 89.3, 105.1, 97.1 };
  9. jbc.theRadio.hasTweeters = true;
  10.  
  11. //以二进制格式保存car
  12. SaveAsBinaryFormat(jbc,"CarDara.dat");
  13.  
  14. Console.ReadLine();
  15.  
  16. }
  17. static void SaveAsBinaryFormat(object objGraph, string fileName)
  18. {
  19. BinaryFormatter binFormat = new BinaryFormatter();
  20. using (Stream fStream=new FileStream(fileName,FileMode.Create,FileAccess.Write,FileShare.None))
  21. {
  22. binFormat.Serialize(fStream, objGraph);
  23. }
  24. Console.WriteLine("保存成功了");
  25. }

使用BinaryFormatter反序列化对象,SOAP和XML反序列化类似

  1. /// <summary>
  2. /// 反序列化
  3. /// </summary>
  4. /// <param name="fileName">文件名</param>
  5. static void LoadFormBinaryFile(string fileName)
  6. {
  7. BinaryFormatter binFormat = new BinaryFormatter();
  8. using (Stream fStream=File.OpenRead(fileName))
  9. {
  10. JamesBondCar carFormDisk =(JamesBondCar)binFormat.Deserialize(fStream); //Deserialize返回的是object类型,转下型然后接收就可以了
  11. Console.WriteLine("fly属性:{0}",carFormDisk.canFly);
  12. }
  13. }

②使用SoapFprmatter序列化对象

  1. static void SaveAsSoapFormat(object objGraph,string fileName)
  2. {
  3. SoapFormatter soapFomat = new SoapFormatter();
  4. using (Stream fStream=new FileStream(fileName,FileMode.Create,FileAccess.Write,FileShare.None))
  5. {
  6. soapFomat.Serialize(fStream,objGraph);
  7. }
  8. Console.WriteLine("保存Soap格式成功");
  9. }

③使用XmlSerializer序列化对象

  1. static void SaveAsXmlFormat(object objGraph, string fileName)
  2. {
  3. //此类的构成函数必须给参数,需要确定你对谁进行序列化
  4. XmlSerializer xmlFormat = new XmlSerializer(typeof(JamesBondCar));
  5. using (Stream fStream=new FileStream(fileName,FileMode.Create,FileAccess.Write,FileShare.None))
  6. {
  7. xmlFormat.Serialize(fStream,objGraph);
  8. }
  9. Console.WriteLine("序列化XML完成");
  10. }

XmlSerializer要求对象图中的所有序列化类型支持默认的构造函数。没有的话需要加上

上面三种可以看出,XML格式是最清楚和简单的。

控制生成的XML数据

System.Xml.Serialization命名空间中的部分特性

例如:

如果想更深一点的了解可以去官网查看

序列化对象集合

前面已经演示了如何将一个对象持久化为一个流,下面演示如何保存一组对象。

一组对象就需要用到集合了。(数组、ArrayList或List<T>)。用数组代替我们之前用的单个对象就可以了

  1. List<JamesBondCar> myCars = new List<JamesBondCar>()
  2. {
  3. new JamesBondCar(){ canFly=true, canSubmerge=false, isHatchBack=false},
  4. new JamesBondCar(){ canFly=true, canSubmerge=true, isHatchBack=false},
  5. new JamesBondCar(){ canFly=true, canSubmerge=false, isHatchBack=true},
  6. };
  7.  
  8. //以二进制格式保存car
  9. // SaveAsBinaryFormat(jbc, "CarDara.dat");
  10. // LoadFormBinaryFile("CarDara.dat");
  11. //SaveAsSoapFormat(jbc,"CarData.soap");
  12. SaveAsXmlFormat(myCars,"CarData.xml");
  13. Console.ReadLine();
  1. static void SaveAsXmlFormat(List<JamesBondCar> objGraph, string fileName)
  2. {
  3. //此类的构成函数必须给参数,需要确定你对谁进行序列化
  4. XmlSerializer xmlFormat = new XmlSerializer(typeof(List<JamesBondCar>));
  5. using (Stream fStream=new FileStream(fileName,FileMode.Create,FileAccess.Write,FileShare.None))
  6. {
  7. xmlFormat.Serialize(fStream,objGraph);
  8. }
  9. Console.WriteLine("序列化XML完成");
  10. }

另外两个类似。

自定义Soap/Binary序列化过程

System.Runtime.Serizlization命名空间核心类型

深入了解对象序列化

当BinaryFormatter序列化一个对象图时,它负责传送下面的信息到指定的流。

①在对象图中对象的完全限定名(如 MyApp.Car)

②定义对象图的程序名称(如 MyApp.exe)

③SerizlizationInfo 类的一个实例,包含了所有由对象图成员保存的所有描述性数据

SoapFormatter也类似。

使用ISerizlizable自定义序列化

被标记了[Serializable]的对象拥有了实现ISerializable接口的选项。

这个接口就一个方法:

AddValue这个重载很多。

实现了ISerizlizable接口的类型也必须定义一个带有下面签名的特殊构造函数:

例如:

  1. [Serializable]
  2. public class StringData : ISerializable
  3. {
  4. private string dataItemOne = "First data block";
  5. private string dataItemTwo = "More data";
  6. public StringData()
  7. {
  8.  
  9. }
  10. protected StringData(SerializationInfo si,StreamingContext ctx)
  11. {
  12. //从流中得到合并的成员变量
  13. dataItemOne = si.GetString("First_Item").ToLower();
  14. dataItemTwo = si.GetString("dataItemTwo").ToLower();
  15. }
  16. public void GetObjectData(SerializationInfo info, StreamingContext context)
  17. {
  18. //用格式化数据填充SerizlizationInfo对象
  19. info.AddValue("First_Item", dataItemOne.ToUpper());
  20. info.AddValue("dataItemTwo", dataItemTwo.ToUpper());
  21. }
  22. }
  1. StringData myData = new StringData();
  2. SoapFormatter soapFprmat = new SoapFormatter();
  3. using (Stream fStream=new FileStream("MyData.soap",FileMode.Create,FileAccess.Write,FileShare.None))
  4. {
  5. soapFprmat.Serialize(fStream,myData);
  6. }

可以简单的完成

  1. [OnSerializing]
  2. private void OnSerializing(StreamingContext context) //需要带上此参数
  3. {
  4. //在序列化的过程就调用
  5. dataItemOne = dataItemOne.ToUpper();
  6. dataItemTwo = dataItemTwo.ToUpper();
  7. }
  8.  
  9. [OnDeserialized]
  10. private void OnDeserialized(StreamingContext context)
  11. {
  12. //在反序列化的过程就调用
  13. dataItemOne = dataItemOne.ToLower();
  14. dataItemTwo = dataItemTwo.ToLower();
  15. }

这个命名空间介绍完了,涉及的类有点多。。。

System.IO 二的更多相关文章

  1. C#、.Net代码精简优化(空操作符(??)、as、string.IsNullOrEmpty() 、 string.IsNullOrWhiteSpace()、string.Equals()、System.IO.Path 的用法)

    一.空操作符(??)在程序中经常会遇到对字符串或是对象判断null的操作,如果为null则给空值或是一个指定的值.通常我们会这样来处理: .string name = value; if (name ...

  2. System.IO中的File、FileInfo、Directory与DirectoryInfo类(实例讲解)

    一.建立的文件夹(对这些文件进行以上四个类的操作): 父目录: 父目录的子目录以及父目录下的文件: 子目录下的文件: 二.效果图 三.代码实现 using System; using System.I ...

  3. 多种下载文件方式 Response.BinaryWrite(byte[] DocContent);Response.WriteFile(System.IO.FileInfo DownloadFile .FullName);Response.Write(string html2Excel);

    通过html给xls赋值,并下载xls文件 一.this.Response.Write(sw.ToString());System.IO.StringWriter sw = new System.IO ...

  4. C# System.IO.Path

    Path的常用方法 函数列表 对一个路径做相应操作,包括文件路径,目录路径,通常会用到Path这个类, 本文列举一些常用的操作. 获取指定路径字符串的目录信息 public static string ...

  5. C# System.IO 文件流输入输出

    一.读写文本文件 可以用fileStream来读写文本文件,但是FileStream是通过字节形式来读写数据的,要把字节数据转换为文本,要自己处理编码转换. 对于文本文件的读写,通常用 StreamR ...

  6. Pipe——高性能IO(二)

    Pipelines - .NET中的新IO API指引(一) Pipelines - .NET中的新IO API指引(二) 关于System.IO.Pipelines的一篇说明 System.IO.P ...

  7. 【等待事件】等待事件系列(3+4)--System IO(控制文件)+日志类等待

     [等待事件]等待事件系列(3+4)--System IO(控制文件)+日志类等待   1  BLOG文档结构图     2  前言部分   2.1  导读和注意事项 各位技术爱好者,看完本文后,你可 ...

  8. Fiddler的一些坑: !SecureClientPipeDirect failed: System.IO.IOException

    手机的请求Fiddler可以捕捉,但是手机一直无法上网,在logs中看到的日志如下: !SecureClientPipeDirect failed: System.IO.IOException 由于远 ...

  9. 服务 在初始化安装时发生异常:System.IO.FileNotFoundException: "file:///D:\testService"未能加载文件或程序集。系统找不到指定文件。

    @echo.@if exist "%windir%\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe" goto INSTALL ...

随机推荐

  1. myEclipse更换SVN登录账号

    Win10下 找到下面路径删除其下的所有文件 C:\Users\Administrator\AppData\Roaming\Subversion\auth\svn.simple AppData默认隐藏 ...

  2. Quadtrees UVA - 297

    题目链接:https://vjudge.net/problem/UVA-297 题目大意:如上图所示,可以用一个四分树来表示一个黑白图像,方法是用根节点表示整副图像,然后把行列各等分两等分,按照图中的 ...

  3. [转]jQuery: get table column/row index remove table column (by column number)

    本文转自:http://www.xinotes.org/notes/note/1087/ <!DOCTYPE html><html><head> <title ...

  4. ubuntu 16.04下搜狗输入法不能输入中文解决

    之前一段时间正常使用的搜狗输入法突然无法输出中文(具体现象是,可以呼出搜狗输入法界面,但是候选词列表无显示),解决之后记录下来,希望能为同样遇到这个问题的人提供参考.同时附linux下常见软件崩溃问题 ...

  5. (转)iptables简介

    iptables简介 原文:https://www.cnblogs.com/metoy/p/4320813.html netfilter/iptables(简称为iptables)组成Linux平台下 ...

  6. SUN巡检命令

    # hostname (主机名)# hostid# uname -X# uname -a # w (进程)# who# last# ps -eaf# /usr/ucb/ps -aux# prstat ...

  7. SWIG 和 Python——c/c++与脚本交互

    C 和 C++ 被公认为(理当如此)创建高性能代码的首选平台.对开发人员的一个常见要求是向脚本语言接口公开 C/C++ 代码,这正是 Simplified Wrapper and Interface ...

  8. linq 两个字段排序

    在linq中排序方法有: OrderBy()  --对某列升序排序 ThenBy()    --某列升序后对另一列后续升序排序 OrderByDescending() --对某列降序排序 ThenBy ...

  9. 合唱队(华为OJ)

    描述 计算最少出列多少位同学,使得剩下的同学排成合唱队形 说明: N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形. 合唱队形是指这样的一种队形:设K位同学从左 ...

  10. Hibernate课程 初探一对多映射3-4 双向多对一的测试

    1 单向多对一和单向多对一的区别 比如部门和员工,一个部门下有很多员工,如果只查一个员工属于哪个部门,就用单向的,如果还要查一个部门下的所有员工,就用双向的. 2 双向多对一的配置 除了单向xml和双 ...