翼度科技»论坛 编程开发 .net 查看内容

CSharpe中的IO+NPOI+序列化

5

主题

5

帖子

15

积分

新手上路

Rank: 1

积分
15
CSharpe中的IO+NPOI+序列化

文件文件夹操作

学习一下常见的文件、文件夹的操作。
什么是IO流?
I:就是input O:就是output,故称:输入输出流
将数据读入内存或者内存输出的过程。
常见的IO流操作,一般说的是[内存]与[磁盘]之间的输入输出。
作用
持久化数据,保证数据不再丢失!
文件操作流程:打开文件、读写数据、关闭文件。
常见的文件IO操作
  1.   //这是操作文件、文件夹必备
  2.   if (!Directory.Exists(LogPath))//检测文件夹是否存在
  3.   {
  4.   }
  5.   DirectoryInfo directory = new DirectoryInfo(LogPath);//对文件夹、文件的描述对象、不存在不报错  注意exists属性
  6.   Console.WriteLine($"全名称:{directory.FullName} || 创建时间:{directory.CreationTime} || 最后写入时间:{directory.LastWriteTime}");
  7.   //路径拼接,得到一个完整的路径
  8.   string filePath = Path.Combine(LogPath, "info.txt");
  9.   if (!File.Exists(filePath))
  10.   {
  11.   }
  12.   FileInfo fileInfo = new FileInfo(filePath);
  13.   Console.WriteLine($"全名称:{fileInfo.FullName} || 创建时间:{fileInfo.CreationTime} || 最后写入时间:{fileInfo.LastWriteTime}");
复制代码
常见的文件夹操作
  1. {
  2.      if (!Directory.Exists(LogPath))
  3.      {
  4.          DirectoryInfo directoryInfo = Directory.CreateDirectory(LogPath);//一次性创建全部的子路径
  5.          Directory.Move(LogPath, LogMovePath);//移动  原文件夹就不在了
  6.          Directory.Delete(LogMovePath);//删除
  7.      }
  8. }
复制代码
常见的文件读写 操作
  1. string fileName = Path.Combine(LogPath, "log.txt");
  2. string fileNameCopy = Path.Combine(LogPath, "logCopy.txt");
  3. string fileNameMove = Path.Combine(LogPath, "logMove.txt");
  4. bool isExists = File.Exists(fileName);
  5. if (!isExists)
  6. {
  7.      Directory.CreateDirectory(LogPath);//创建了文件夹之后,才能创建里面的文件
  8.      using (FileStream fileStream = File.Create(fileName))//打开文件流 (创建文件并写入)
  9.      {
  10.          string name = "12345567778890";
  11.          byte[] bytes = Encoding.Default.GetBytes(name);
  12.          fileStream.Write(bytes, 0, bytes.Length);
  13.          fileStream.Flush();
  14.      }
  15.      using (FileStream fileStream = File.Create(fileName))//打开文件流 (创建文件并写入)
  16.      {
  17.          StreamWriter sw = new StreamWriter(fileStream);
  18.          sw.WriteLine("1234567890");
  19.          sw.Flush();
  20.      }
  21.      using (StreamWriter sw = File.AppendText(fileName))//流写入器(创建/打开文件并写入)
  22.      {
  23.          string msg = "大家好,我是Richard老师!!";
  24.          sw.WriteLine(msg);
  25.          sw.Flush();
  26.      }
  27.      using (StreamWriter sw = File.AppendText(fileName))//流写入器(创建/打开文件并写入)
  28.      {
  29.          string name = "0987654321";
  30.          byte[] bytes = Encoding.Default.GetBytes(name);
  31.          sw.BaseStream.Write(bytes, 0, bytes.Length);
  32.          sw.Flush();
  33.      }
  34.      //文件的读取
  35.      foreach (string result in File.ReadAllLines(fileName))//读取文件中所有的行信息
  36.      {
  37.          Console.WriteLine(result);
  38.      }
  39.      string sResult = File.ReadAllText(fileName);
  40.      Byte[] byteContent = File.ReadAllBytes(fileName);
  41.      string sResultByte = System.Text.Encoding.UTF8.GetString(byteContent);
  42.      //建议大家不要去做多线程读取,即使要多线程读取,也要加锁,加锁----反多线程;
  43.      //你们有没有遇到过大文件Txt---10G
  44.      using (FileStream stream = File.OpenRead(fileName))//分批读取
  45.      {
  46.          int length = 5;
  47.          int result = 0;
  48.          do
  49.          {
  50.              byte[] bytes = new byte[length];
  51.              result = stream.Read(bytes, 0, 5);
  52.              for (int i = 0; i < result; i++)
  53.              {
  54.                  Console.WriteLine(bytes[i].ToString());
  55.              }
  56.          }
  57.          while (length == result);
  58.      }
  59.      File.Copy(fileName, fileNameCopy);
  60.      File.Move(fileName, fileNameMove);
  61.      File.Delete(fileNameCopy);
  62.      File.Delete(fileNameMove);//尽量不要delete
  63. }
复制代码
常见的盘符操作
  1. {//DriveInfo
  2.     DriveInfo[] drives = DriveInfo.GetDrives();//获取当前计算机所有盘符
  3.     foreach (DriveInfo drive in drives)
  4.     {
  5.         if (drive.IsReady)
  6.             Console.WriteLine($"类型:{drive.DriveType} 卷标:{drive.VolumeLabel} 名称:{drive.Name} 总空间:{drive.TotalSize} 剩余空间:{drive.TotalFreeSpace}");
  7.         else
  8.             Console.WriteLine("类型:{drive.DriveType}  is not ready");
  9.     }
  10. }
  11. {
  12.     Console.WriteLine(Path.GetDirectoryName(LogPath));  //返回目录名,需要注意路径末尾是否有反斜杠对结果是有影响的
  13.     Console.WriteLine(Path.GetDirectoryName(@"d:\\abc")); //将返回 d:\
  14.     Console.WriteLine(Path.GetDirectoryName(@"d:\\abc"));// 将返回 d:\abc
  15.     Console.WriteLine(Path.GetRandomFileName());//将返回随机的文件名
  16.     Console.WriteLine(Path.GetFileNameWithoutExtension("d:\\abc.txt"));// 将返回abc
  17.     Console.WriteLine(Path.GetInvalidPathChars());// 将返回禁止在路径中使用的字符
  18.     Console.WriteLine(Path.GetInvalidFileNameChars());//将返回禁止在文件名中使用的字符
  19.     Console.WriteLine(Path.Combine(LogPath, "log.txt"));//合并两个路径
  20. }
复制代码
递归获取所有的文件
  1. public static List<DirectoryInfo> GetAllDirectory(string rootPath)
  2. {
  3.      if (!Directory.Exists(rootPath))  
  4.          return new List<DirectoryInfo>();
  5.      List<DirectoryInfo> directoryList = new List<DirectoryInfo>();//容器
  6.      DirectoryInfo directory = new DirectoryInfo(rootPath);//root文件夹
  7.      directoryList.Add(directory);
  8.      return GetChild(directoryList, directory);
  9. }
  10. /// <summary>
  11. /// 完成 文件夹--子目录--放入集合
  12. /// </summary>
  13. /// <param name="directoryList"></param>
  14. /// <param name="directoryCurrent"></param>
  15. /// <returns></returns>
  16. private static List<DirectoryInfo> GetChild(List<DirectoryInfo> directoryList, DirectoryInfo directoryCurrent)
  17. {
  18.      var childArray = directoryCurrent.GetDirectories();
  19.      if (childArray != null && childArray.Length > 0)
  20.      {
  21.          directoryList.AddRange(childArray);
  22.          foreach (var child in childArray)
  23.          {
  24.              GetChild(directoryList, child);
  25.          }
  26.      }
  27.      return directoryList;
  28. }
复制代码
NPOI操作Excel

NPOI背景

Apache Poi是一种流行的API,它允许程序员使用java程序创建,修改和显示MS Office文件。这由Apche软件基金会开发使用java分布式设计或修改该Microsoft Office文件的开源库,它包含类和方法对用户输入数据或文件到Ms Office文档进行解码;
NPOI是什么呢?顾名思义就是POI的.NET版本,可以通过.NET来操作Office文档。
使用NPOI

名词解释
整个Excel:工作簿
Sheet页:页签,一个工作簿客户可以包含多个Sheet页。
表格:对应一个Sheet
行、列、单元格
C#中的常规操作:
导出一个Excel:其实就是要生成一个Excel文件,Excel文件对应的文件流。
导入一个Excel:读取一个文件,读取文件流,需要从文件流中读取我们需要的各种数据,解析Excel的数据。
创建一个Excel文件:
  1. public class ExcelOperationHelper
  2. {
  3.      public static IWorkbook CreateExcelWorkbook(string filePath)
  4.      {
  5.          IWorkbook workbook = null;
  6.          if (filePath.EndsWith(".xls"))
  7.          {
  8.              workbook = new NPOI.HSSF.UserModel.HSSFWorkbook();
  9.          }
  10.          else if (filePath.EndsWith(".xlsx"))
  11.          {
  12.              workbook = new NPOI.XSSF.UserModel.XSSFWorkbook();
  13.          }
  14.          ISheet sheet = workbook.CreateSheet("Sheet1");
  15.          {
  16.              IRow row = sheet.CreateRow(0);
  17.              ICell cell = row.CreateCell(0);
  18.              cell.SetCellValue("学生姓名");
  19.              ICell cell1 = row.CreateCell(1);
  20.              cell1.SetCellValue("数学成绩");
  21.              ICell cell2 = row.CreateCell(2);
  22.              cell2.SetCellValue("语文成绩");
  23.          }
  24.          {
  25.              IRow row = sheet.CreateRow(1);
  26.              ICell cell = row.CreateCell(0);
  27.              cell.SetCellValue("JJ鹏");
  28.              ICell cell1 = row.CreateCell(1);
  29.              cell1.SetCellValue("100");
  30.              ICell cell2 = row.CreateCell(2);
  31.              cell2.SetCellValue("150");
  32.          }
  33.          return workbook;
  34.      }
  35. }
复制代码
Programs.cs
  1.     IWorkbook work = ExcelOperationHelper.CreateExcelWorkbook(path);
  2.     using (FileStream file=new FileStream(path,FileMode.Create))
  3.     {
  4.         work.Write(file);
  5.         file.Close();
  6.     }
复制代码
数据实体设置

需要考虑的问题

  • 数据写道工作簿中的哪个sheet页中
  • 生成的Excel---考虑表头放在哪个位置
  • 直接集合中的某一个对象来直接生成---如果对象是一个实体---实体中有多少个属性;就表示多少个列;
    最终的目标:做到业务系统不需要考虑其他,只需要按照规则来给定数据即可,就可以生成Excel出来。
数据实体
  1. public class ExcelDataResource
  2. {
  3.     /// <summary>
  4.     /// 保存到Sheet的名称
  5.     /// </summary>
  6.     public string SheetName { get; set; }
  7.     /// <summary>
  8.     /// 标题所在行
  9.     /// </summary>
  10.     public int TitleIndex { get; set; }
  11.     /// <summary>
  12.     /// 每一个sheet的数据
  13.     /// </summary>
  14.     public List<object> SheetDataResource { get; set; }
  15. }
复制代码
添加一个新的特性
  1. public class TitleAttribute:Attribute
  2. {
  3.      public string Title { get; set; }
  4.      public TitleAttribute(string title)
  5.      {
  6.          Title = title;
  7.      }
  8. }
复制代码
用户的信息
  1.     public class UserInfo
  2.     {
  3.         [Title("用户ID")]
  4.         public int UserId { get; set; }
  5.         [Title("用户名称")]
  6.         public string UserName { get; set; }
  7.         [Title("用户年龄")]
  8.         public int UserAge { get; set; }
  9.         [Title("用户类型")]
  10.         public string UserType { get; set; }
  11.         [Title("描述")]
  12.         public string Description { get; set; }
  13.     }
  14. }
复制代码
根据固定格式生成IWorkBook

生成我们需要的excel的数据
  1. static List<ExcelDataResource> GetExcelDataList()
  2. {
  3.     List<object> objlist = new List<object>();
  4.     for (int i = 0; i < 100; i++)
  5.     {
  6.         objlist.Add(new UserInfo()
  7.         {
  8.             UserId = i + 1,
  9.             UserName = $"名称-{i}",
  10.             UserAge = i + i + 1,
  11.             UserType = i + 1,
  12.             Description = $"描述_描述_描述_描述_描述_描述_描述_描述_描述_描述_{i}"
  13.         });
  14.     }
  15.     List<object> Classobjlist = new List<object>();
  16.     for (int i = 0; i < 200; i++)
  17.     {
  18.         Classobjlist.Add(new ClassInfo()
  19.         {
  20.             UserId = i + 1,
  21.             UserName = $"名称-{i}",
  22.             Age = i + i + 1,
  23.             UserType = i + 1,
  24.             Description1 = $"描述_描述_描述_描述_描述_描述_描述_描述_描述_描述_{i}",
  25.             Description2 = $"描述_描述_描述_描述_描述_描述_描述_描述_描述_描述_{i}",
  26.             Description3 = $"描述_描述_描述_描述_描述_描述_描述_描述_描述_描述_{i}",
  27.             Description4 = $"描述_描述_描述_描述_描述_描述_描述_描述_描述_描述_{i}"
  28.         });
  29.     }
  30.     return new List<ExcelDataResource>()
  31.                     {
  32.                          new ExcelDataResource(){
  33.                                 SheetName="页签1",
  34.                                 TitleIndex=1,
  35.                                 SheetDataResource=objlist
  36.                          },
  37.                          new ExcelDataResource(){
  38.                                 SheetName="页签2",
  39.                                 TitleIndex=1,
  40.                                 SheetDataResource=Classobjlist
  41.                          }
  42.                     };
  43. }
复制代码
生成DataToXSSFWorkbook工作簿
  1. public static IWorkbook DataToXSSFWorkbook(List<ExcelDataResource> dataResources)
  2. {
  3.     XSSFWorkbook _Workbook = new XSSFWorkbook();
  4.     if (dataResources == null && dataResources.Count == 0)
  5.     {
  6.         return _Workbook;
  7.     }
  8.     foreach (var sheetResource in dataResources)
  9.     {
  10.         if (sheetResource.SheetDataResource != null && sheetResource.SheetDataResource.Count == 0)
  11.         {
  12.             break;
  13.         }
  14.         ISheet sheet = _Workbook.CreateSheet(sheetResource.SheetName);
  15.         object obj = sheetResource.SheetDataResource[0];
  16.         Type type = obj.GetType();
  17.         List<PropertyInfo> propList = type.GetProperties().Where(c => c.IsDefined(typeof(TitleAttribute), true)).ToList();
  18.         IRow titleRow = sheet.CreateRow(0);
  19.         ICellStyle style = _Workbook.CreateCellStyle();
  20.         style.FillForegroundColor = NPOI.HSSF.Util.HSSFColor.Grey25Percent.Index;
  21.         style.FillPattern = FillPattern.SolidForeground;
  22.         style.FillBackgroundColor = NPOI.HSSF.Util.HSSFColor.Automatic.Index;
  23.         style.Alignment = HorizontalAlignment.CenterSelection;
  24.         style.VerticalAlignment = VerticalAlignment.Center;
  25.         titleRow.Height = 100 * 4;
  26.         for (int i = 0; i < propList.Count(); i++)
  27.         {
  28.             TitleAttribute propertyAttribute = propList[i].GetCustomAttribute<TitleAttribute>();
  29.             ICell cell = titleRow.CreateCell(i);
  30.             cell.SetCellValue(propertyAttribute.Title);
  31.             cell.CellStyle = style;
  32.         }
  33.         for (int i = 0; i < sheetResource.SheetDataResource.Count(); i++)
  34.         {
  35.             IRow row = sheet.CreateRow(i + 1);
  36.             object objInstance = sheetResource.SheetDataResource[i];
  37.             for (int j = 0; j < propList.Count; j++)
  38.             {
  39.                 ICell cell = row.CreateCell(j);
  40.                 cell.SetCellValue(propList[j].GetValue(objInstance).ToString());
  41.             }
  42.         }
  43.     }
  44.     return _Workbook;
  45. }
复制代码
对应的使用的例子为:
  1. List<ExcelDataResource> excelDataList = GetExcelDataList();
  2. IWorkbook workbook1 = ExcelOperationHelper.DataToXSSFWorkbook(excelDataList);
  3. using (FileStream file=new FileStream(path,FileMode.Create))
  4. {
  5.      workbook1.Write(file);
  6.      file.Close();
  7. }
复制代码
开发中的各种应用场景


  • 写入Response二进制流
  1. public void ImportExcelFileOnWriteResponse(int id)
  2. {
  3.      ///设置ContentType
  4.      HttpContext.Response.ContentType = "application/vnd.ms-excel";
  5.      ///生成文件名
  6.      string fileName = DateTime.Now.ToString("yyyyMMddHHmmssffffff");
  7.      ///设置Excel文件名
  8.      HttpContext.Response.Headers.Add("Content-Disposition", $"attachment;filename={fileName}.xls");
  9.      // 获取导出Excel需要的数据源
  10.      List<ExcelDataResource> excelDataResources = GetExcelSheetData(id);
  11.      byte[] bt = ExcelOperationHelper.ToExcelByteArray(excelDataResources);
  12.      HttpContext.Response.BodyWriter.WriteAsync(bt);
  13. }
复制代码

  • 调用框架的file方法
  1. public IActionResult ImportExcelFileOnFileMethod(int id)
  2. {
  3.      List<ExcelDataResource> excelDataResources = GetExcelSheetData(id);
  4.      byte[] bt = ExcelOperationHelper.ToExcelByteArray(excelDataResources);
  5.      string fileName = DateTime.Now.ToString("yyyyMMddHHmmssffffff");
  6.      return File(bt, "application/vnd.ms-excel", $"{fileName}.xls");
  7. }
复制代码

  • 扩展IActionResult方法 ExcelResult方法
  1.   public IActionResult ImportExcelFileOnActionResultExtend(int id)
  2.   {
  3.       // 获取导出Excel需要的数据源
  4.       List<ExcelDataResource> list = GetExcelSheetData(id);
  5.       return new ExcelResult(list);  //调用IActionResult的扩展返回Excel
  6.   }
复制代码
对应IActionResult的实现
  1. public class ExcelResult : IActionResult
  2. {
  3.      private string _ExcelName;
  4.      private List<ExcelDataResource> _ExcelDataResources;
  5.      /// <summary>
  6.      /// 如果没有时间就默认以当前时间为文件名称
  7.      /// </summary>
  8.      /// <param name="excelDataResources"></param>
  9.      public ExcelResult(List<ExcelDataResource> excelDataResources) : this(DateTime.Now.ToString("yyyyMMddHHmmssffffff"), excelDataResources)
  10.      {
  11.      }
  12.      /// <summary>
  13.      /// 构造函数
  14.      /// </summary>
  15.      /// <param name="excelName">文件名称</param>
  16.      /// <param name="excelDataResources">数据源</param>
  17.      public ExcelResult(string excelName, List<ExcelDataResource> excelDataResources)
  18.      {
  19.          this._ExcelName = excelName;
  20.          this._ExcelDataResources = excelDataResources;
  21.      }
  22.      public Task ExecuteResultAsync(ActionContext context)
  23.      {
  24.          return Task.Run(() =>
  25.          {               
  26.              context.HttpContext.Response.ContentType = "application/vnd.ms-excel";
  27.              context.HttpContext.Response.Headers.Add("Content-Disposition", $"attachment;filename={_ExcelName}.xls");
  28.              byte[] bt = ExcelOperationHelper.ToExcelByteArray(_ExcelDataResources);
  29.              context.HttpContext.Response.BodyWriter.WriteAsync(bt);
  30.          });
  31.      }
  32. }
复制代码
excel导入

本质:目的是把Excel文件提交到服务器,然后把Excel文件中的数据信息读取出来,然后要处理的就是数据信息,
Excel文件的解析

  • Excel文件---文件流 fileStream MemoryStream Byte[]----->IWorkbook,如果得到了一个IWorkbook就可以使用Npoi来进行解析.
转换为DataTable
  1.   public static List<DataTable> ToExcelDateTable(IWorkbook hSSFWorkbook)
  2.   {
  3.       List<DataTable> datatableList = new List<DataTable>();
  4.       for (int sheetIndex = 0; sheetIndex < hSSFWorkbook.NumberOfSheets; sheetIndex++)
  5.       {
  6.           ISheet sheet = hSSFWorkbook.GetSheetAt(sheetIndex);
  7.           //获取表头 FirstRowNum 第一行索引 0
  8.           IRow header = sheet.GetRow(sheet.FirstRowNum);//获取第一行
  9.           if (header == null)
  10.           {
  11.               break;
  12.           }
  13.           int startRow = 0;//数据的第一行索引
  14.           DataTable dtNpoi = new DataTable();
  15.           startRow = sheet.FirstRowNum + 1;
  16.           for (int i = header.FirstCellNum; i < header.LastCellNum; i++)
  17.           {
  18.               ICell cell = header.GetCell(i);
  19.               if (cell != null)
  20.               {
  21.                   string cellValue = $"Column{i + 1}_{cell.ToString()}";
  22.                   if (cellValue != null)
  23.                   {
  24.                       DataColumn col = new DataColumn(cellValue);
  25.                       dtNpoi.Columns.Add(col);
  26.                   }
  27.                   else
  28.                   {
  29.                       DataColumn col = new DataColumn();
  30.                       dtNpoi.Columns.Add(col);
  31.                   }
  32.               }
  33.           }
  34.           //数据    LastRowNum 最后一行的索引 如第九行---索引 8
  35.           for (int i = startRow; i <= sheet.LastRowNum; i++)
  36.           {
  37.               IRow row = sheet.GetRow(i);//获取第i行
  38.               if (row == null)
  39.               {
  40.                   continue;
  41.               }
  42.               DataRow dr = dtNpoi.NewRow();
  43.               //遍历每行的单元格
  44.               for (int j = row.FirstCellNum; j < row.LastCellNum; j++)
  45.               {
  46.                   if (row.GetCell(j) != null)
  47.                       dr[j] = row.GetCell(j).ToString();
  48.               }
  49.               dtNpoi.Rows.Add(dr);
  50.           }
  51.           datatableList.Add(dtNpoi);
  52.       }
  53.       return datatableList;
  54.   }
复制代码
序列化和反序列化

序列化(Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或永久性存储区。以后,可以通过存储区中读取或反序列化对象的状态,重新创建该对象。
序列化之前:对象
序列化之后:把一个对象转换成另外一种形式来存储。
原始数据:
  1. public IActionResult ImportExcelOnFormSubmit()
  2. {
  3.      //获取上传的Excel文件
  4.      IFormFile file = Request.Form.Files["file"];
  5.      if (file != null && file.Length > 0)
  6.      {
  7.          string suffixName = Path.GetExtension(file.FileName).ToLower();
  8.          if (suffixName != ".xls" && suffixName != ".xlsx")
  9.          {
  10.              return Content("请导入文件为Excel格式");
  11.          }
  12.          XSSFWorkbook hSSFWorkbook = new XSSFWorkbook(file.OpenReadStream());
  13.          List<DataTable> datatableList = ExcelOperationHelper.ToExcelDateTable(hSSFWorkbook);
  14.          ViewBag.Info = Newtonsoft.Json.JsonConvert.SerializeObject(datatableList);
  15.      }
  16.      else
  17.      {
  18.          ViewBag.Info = "请上传文件";
  19.      }
  20.      return View();
  21. }
复制代码
XML序列化
  1.   public class DataFactory
  2.   {
  3.       /// <summary>
  4.       /// 初始化数据的
  5.       /// </summary>
  6.       /// <returns></returns>
  7.       public static List<Programmer> BuildProgrammerList()
  8.       {
  9.           #region data prepare
  10.           List<Programmer> list = new List<Programmer>();
  11.           list.Add(new Programmer()
  12.           {
  13.               Id = 1,
  14.               Description = "Richard老师的学员",
  15.               Name = "SoWhat",
  16.               Sex = "男"
  17.           });
  18.           list.Add(new Programmer()
  19.           {
  20.               Id = 1,
  21.               Description = "Richard老师的学员",
  22.               Name = "day",
  23.               Sex = "男"
  24.           });
  25.           list.Add(new Programmer()
  26.           {
  27.               Id = 1,
  28.               Description = "Richard老师的学员",
  29.               Name = "领悟",
  30.               Sex = "男"
  31.           });
  32.           list.Add(new Programmer()
  33.           {
  34.               Id = 1,
  35.               Description = "Richard老师的学员",
  36.               Name = "Sam",
  37.               Sex = "男"
  38.           });
  39.           list.Add(new Programmer()
  40.           {
  41.               Id = 1,
  42.               Description = "Richard老师的学员",
  43.               Name = "AlphaGo",
  44.               Sex = "男"
  45.           });
  46.           list.Add(new Programmer()
  47.           {
  48.               Id = 1,
  49.               Description = "Richard老师的学员",
  50.               Name = "折腾",
  51.               Sex = "男"
  52.           });
  53.           list.Add(new Programmer()
  54.           {
  55.               Id = 1,
  56.               Description = "Richard老师的学员",
  57.               Name = "Me860",
  58.               Sex = "男"
  59.           });
  60.           list.Add(new Programmer()
  61.           {
  62.               Id = 1,
  63.               Description = "Richard老师的学员",
  64.               Name = "打兔子的猎人",
  65.               Sex = "男"
  66.           });
  67.           list.Add(new Programmer()
  68.           {
  69.               Id = 1,
  70.               Description = "Richard老师的学员",
  71.               Name = "Nine",
  72.               Sex = "女"
  73.           });
  74.           list.Add(new Programmer()
  75.           {
  76.               Id = 1,
  77.               Description = "Richard老师的学员",
  78.               Name = "望",
  79.               Sex = "女"
  80.           });
  81.           list.Add(new Programmer()
  82.           {
  83.               Id = 1,
  84.               Description = "Richard老师的学员",
  85.               Name = "微笑刺客",
  86.               Sex = "男"
  87.           });
  88.           list.Add(new Programmer()
  89.           {
  90.               Id = 1,
  91.               Description = "Richard老师的学员",
  92.               Name = "waltz",
  93.               Sex = "男"
  94.           });
  95.           list.Add(new Programmer()
  96.           {
  97.               Id = 1,
  98.               Description = "Richard老师的学员",
  99.               Name = "爱在昨天",
  100.               Sex = "男"
  101.           });
  102.           list.Add(new Programmer()
  103.           {
  104.               Id = 1,
  105.               Description = "Richard老师的学员",
  106.               Name = "waltz",
  107.               Sex = "男"
  108.           });
  109.           #endregion
  110.           return list;
  111.       }
  112.   }
  113.   [Serializable]  //必须添加序列化特性
  114.   public class Person
  115.   {
  116.       [NonSerialized]
  117.       public int Id = 1;
  118.       public string Name { get; set; }
  119.       public string Sex { get; set; }
  120.   }
  121.   [Serializable]  //必须添加序列化特性
  122.   public class Programmer : Person
  123.   {
  124.       private string Language { get; set; }//编程语言
  125.       public string Description { get; set; }
  126.   }
复制代码
jSON序列化
  1.   public class XmlHelper
  2.   {
  3.       /// <summary>
  4.       /// XmlSerializer序列化实体为字符串
  5.       /// </summary>
  6.       /// <typeparam name="T"></typeparam>
  7.       /// <param name="t"></param>
  8.       /// <returns></returns>
  9.       public static string ToXml<T>(T t) where T : new()
  10.       {
  11.           XmlSerializer xmlSerializer = new XmlSerializer(t.GetType());
  12.           Stream stream = new MemoryStream();
  13.           xmlSerializer.Serialize(stream, t);
  14.           stream.Position = 0;
  15.           StreamReader reader = new StreamReader(stream);
  16.           string text = reader.ReadToEnd();
  17.           return text;
  18.       }
  19.       /// <summary>
  20.       /// 字符串序列化成XML
  21.       /// </summary>
  22.       /// <typeparam name="T"></typeparam>
  23.       /// <param name="content"></param>
  24.       /// <returns></returns>
  25.       public static T ToObject<T>(string content) where T : new()
  26.       {
  27.           using (MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(content)))
  28.           {
  29.               XmlSerializer xmlFormat = new XmlSerializer(typeof(T));
  30.               return (T)xmlFormat.Deserialize(stream);
  31.           }
  32.       }
  33.       /// <summary>
  34.       /// 文件反序列化成实体
  35.       /// </summary>
  36.       /// <typeparam name="T"></typeparam>
  37.       /// <param name="fileName"></param>
  38.       /// <returns></returns>
  39.       public static T FileToObject<T>(string fileName) where T : new()
  40.       {
  41.           fileName = Path.Combine(Constant.basePath, "File", @"Student.xml");
  42.           using (Stream fStream = new FileStream(fileName, FileMode.Open, FileAccess.ReadWrite))
  43.           {
  44.               XmlSerializer xmlFormat = new XmlSerializer(typeof(T));
  45.               return (T)xmlFormat.Deserialize(fStream);
  46.           }
  47.       }
  48.   }
复制代码
调用的实例
  1. public class JsonHelper
  2. {
  3.      #region Json
  4.      /// <summary>
  5.      /// JavaScriptSerializer
  6.      /// </summary>
  7.      /// <typeparam name="T"></typeparam>
  8.      /// <param name="obj"></param>
  9.      /// <returns></returns>
  10.      public static string ObjectToString<T>(T obj)
  11.      {
  12.          JavaScriptSerializer jss = new JavaScriptSerializer();
  13.          return jss.Serialize(obj);
  14.      }
  15.      /// <summary>
  16.      /// JavaScriptSerializer
  17.      /// </summary>
  18.      /// <typeparam name="T"></typeparam>
  19.      /// <param name="content"></param>
  20.      /// <returns></returns>
  21.      public static T StringToObject<T>(string content)
  22.      {
  23.          JavaScriptSerializer jss = new JavaScriptSerializer();
  24.          return jss.Deserialize<T>(content);
  25.      }
  26.      /// <summary>
  27.      /// JsonConvert.SerializeObject
  28.      /// </summary>
  29.      /// <typeparam name="T"></typeparam>
  30.      /// <param name="obj"></param>
  31.      /// <returns></returns>
  32.      public static string ToJson<T>(T obj)
  33.      {
  34.          return JsonConvert.SerializeObject(obj);
  35.      }
  36.      /// <summary>
  37.      /// JsonConvert.DeserializeObject
  38.      /// </summary>
  39.      /// <typeparam name="T"></typeparam>
  40.      /// <param name="content"></param>
  41.      /// <returns></returns>
  42.      public static T ToObject<T>(string content)
  43.      {
  44.          try
  45.          {
  46.              return JsonConvert.DeserializeObject<T>(content);
  47.          }
  48.          catch (Exception)
  49.          {
  50.              throw;
  51.          }
  52.      }
  53.      #endregion Json
  54. }
复制代码
来源:https://www.cnblogs.com/wenlong-4613615/p/18222548
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具