C# 对象持久化详解

发布时间 - 2026-01-10 23:00:49    点击率:

对象持久化是指将内存中的对象保存到可永久保存的存储设备中(如磁盘)的一种技术。

本文介绍的是除数据库之外的几种对象持久化方式。

具体如下:

  1. 保存成文本:即将内存对象以字节流的方式保存到文本中。
  2. 序列化成Xml:即将对象以Xml的格式存储。
  3. 序列化成Json:即将对象序列化成Json对象,然后存储。
  4. 序列化成二进制:即将对象序列化成二进制字节流保存到文件中。

涉及知识点:

  1. 序列化与反序列化
  2. 文件流的读写
  3. ListView显示复选框,并横向排列

如下图所示【主要功能是将用户输入的信息保存成各种格式,并从各个文档中进行读取出来】:

保存和读取文本文档代码如下:

/// <summary>
  /// 保存成文本
  /// </summary>
  /// <param name="sender"></param>
  /// <param name="e"></param>
  private void btnSaveTxt_Click(object sender, EventArgs e)
  {
   Dictionary<string, string> dicInfos = GetDictionaryInfos();
   string filePath = "objPerson.txt";
   //采用using关键字,会自动释放
   using (FileStream fs = new FileStream(filePath, FileMode.Create))
   {
    using (StreamWriter sw = new StreamWriter(fs, Encoding.Default))
    {
     foreach (var keyPair in dicInfos)
     {
      sw.WriteLine(string.Format("{0}={1}", keyPair.Key, keyPair.Value));
     }
    }
   }
  }
  /// <summary>
  /// 从文本中读取
  /// </summary>
  /// <param name="sender"></param>
  /// <param name="e"></param>
  private void btnReadTxt_Click(object sender, EventArgs e)
  {
   string filePath = "objPerson.txt";
   Dictionary<string, string> dic = new Dictionary<string, string>();
   //采用using关键字,会自动释放
   using (FileStream fs = new FileStream(filePath, FileMode.Open))
   {
    using (StreamReader sw = new StreamReader(fs, Encoding.Default))
    {
     while (!sw.EndOfStream) {
      string lineInfo = sw.ReadLine();
      dic.Add(lineInfo.Split('=')[0], lineInfo.Split('=')[1]);
     }
    }
   }
   this.txtName.Text = dic["Name"];
   this.dtBirthday.Text = dic["Birthday"];
   if (dic["Gender"] == this.rbBoy.Text)
   {
    this.rbBoy.Checked = true;
   }
   else {
    this.rbGirl.Checked = true;
   }
   string[] loves = dic["Love"].Split('|');
   foreach (var love in loves)
   {
    foreach (var item in this.lsvLove.Items)
    {
     ListViewItem li = item as ListViewItem;
     if (li.Text == love)
     {
      li.Checked = true;
     }
    }
   }
  }

保存和读取Xml文档代码如下:

/// <summary>
  /// 保存成Xml
  /// </summary>
  /// <param name="sender"></param>
  /// <param name="e"></param>
  private void btnSaveXml_Click(object sender, EventArgs e)
  {
   Person p = GetPersonInfos();
   string filePath = "objPerson.xml";
   using (FileStream fs = new FileStream(filePath, FileMode.Create))
   {
    XmlSerializer serializer = new XmlSerializer(typeof(Person));
    serializer.Serialize(fs, p);
   }
  }
  /// <summary>
  /// 从Xml中读取
  /// </summary>
  /// <param name="sender"></param>
  /// <param name="e"></param>
  private void btnReadXml_Click(object sender, EventArgs e)
  {
   string filePath = "objPerson.xml";
   Person p;
   using (FileStream fs = new FileStream(filePath, FileMode.Open))
   {
    XmlSerializer serializer = new XmlSerializer(typeof(Person));
    object obj= serializer.Deserialize(fs);
    p = obj as Person;
   }
   SetPersonInfos(p);
  }

保存和读取Json文档如下:

/// <summary>
  /// 保存成Json
  /// </summary>
  /// <param name="sender"></param>
  /// <param name="e"></param>
  private void btnSaveJson_Click(object sender, EventArgs e)
  {
   Person p = GetPersonInfos();
   JavaScriptSerializer jserializer = new JavaScriptSerializer();
   string strJson = jserializer.Serialize(p);
   string strRegex = @"\\/Date\((\d+)\)\\/";
   MatchEvaluator evaluator = new MatchEvaluator(ConvertJsonDateToDateString);

   //对时间进行处理,需要引用System.Text.RegularExpressions;命名空间
   Regex reg = new Regex(strRegex);
   strJson = reg.Replace(strJson, evaluator);
   string filePath = "objPerson.json";
   using (FileStream fs = new FileStream(filePath, FileMode.Create))
   {
    using (StreamWriter sw = new StreamWriter(fs, Encoding.Default))
    {
     sw.Write(strJson);
    }
   }
  }
  /// <summary>
  /// 从Json中读取
  /// </summary>
  /// <param name="sender"></param>
  /// <param name="e"></param>
  private void btnReadJson_Click(object sender, EventArgs e)
  {
   JavaScriptSerializer jserializer = new JavaScriptSerializer();
   string filePath = "objPerson.json";
   Person p;
   using (FileStream fs = new FileStream(filePath, FileMode.Open))
   {
    using (StreamReader sw = new StreamReader(fs, Encoding.Default))
    {
     string strJson = sw.ReadToEnd();
     string strRegex = @"\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}";
     MatchEvaluator evaluator = new MatchEvaluator(ConvertDateStringToJsonDate); //对时间进行处理
     Regex reg = new Regex(strRegex);
     strJson = reg.Replace(strJson, evaluator);
     p = jserializer.Deserialize<Person>(strJson);
    }
   }
   SetPersonInfos(p);
  }

保存和读取Bin文档如下:

/// <summary>
  /// 保存成二进制文件
  /// </summary>
  /// <param name="sender"></param>
  /// <param name="e"></param>
  private void btnSaveBin_Click(object sender, EventArgs e)
  {
   Person p = GetPersonInfos();
   string filePath = "objPerson.bin";
   using (FileStream fs = new FileStream(filePath, FileMode.Create)) {
    BinaryFormatter bf = new BinaryFormatter();
    bf.Serialize(fs, p);
   }
  }
  /// <summary>
  /// 读取二进制文件
  /// </summary>
  /// <param name="sender"></param>
  /// <param name="e"></param>
  private void btnReadBin_Click(object sender, EventArgs e)
  {
   string filePath = "objPerson.bin";
   Person p;
   using (FileStream fs = new FileStream(filePath, FileMode.Open))
   {
    BinaryFormatter bf = new BinaryFormatter();
    p= bf.Deserialize(fs) as Person;
   }
   SetPersonInfos(p);
  }

备注:其实对象持久化和对象序列化是两个不同的概念。两者有关联却不同。

对象持久化:是使对象可以保存到实体存储介质中,在对象生命周期结束后可以再现。

对象序列化:是将对象或者数据结构转化成特定的格式,使其可在网络中传输,或者可存储在内存或者文件中。

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!


# C#  # 对象持久化  # C#使用SqlDataAdapter对象获取数据的方法  # 详解C#中使用对象或集合的初始值设定项初始化的操作  # C#编程中使用ref和out关键字来传递数组对象的用法  # C#编程实现对象与JSON串互相转换实例分析  # C#实现获取不同对象中名称相同属性的方法  # C#中Cookie之存储对象  # C#中使用反射遍历一个对象属性及值的小技巧  # C#查找对象在ArrayList中出现位置的方法  # C#检查指定对象是否存在于ArrayList集合中的方法  # 浅谈对c# 面向对象的理解  # 文档  # 序列化  # 的是  # 是指  # 数据结构  # 可在  # 几种  # 使其  # 所示  # 主要功能  # 并从  # 如下图  # 转化成  # 化与  # 复选框  # 存储设备  # 结束后  # 存储介质  # txt  # FileStream 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel事件监听器怎么写_Laravel Event和Listener使用教程  Laravel安装步骤详细教程_Laravel环境搭建指南  如何在阿里云高效完成企业建站全流程?  Laravel如何使用Facades(门面)及其工作原理_Laravel门面模式与底层机制  微信小程序 require机制详解及实例代码  如何选择可靠的免备案建站服务器?  JavaScript 输出显示内容(document.write、alert、innerHTML、console.log)  ,交易猫的商品怎么发布到网站上去?  Laravel怎么集成Log日志记录_Laravel单文件与每日日志配置及自定义通道【详解】  大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?  Laravel怎么使用Collection集合方法_Laravel数组操作高级函数pluck与map【手册】  html5源代码发行怎么设置权限_访问权限控制方法与实践【指南】  Laravel如何使用API Resources格式化JSON响应_Laravel数据资源封装与格式化输出  Laravel如何优雅地处理服务层_在Laravel中使用Service层和Repository层  php静态变量怎么调试_php静态变量作用域调试技巧【解答】  音乐网站服务器如何优化API响应速度?  Laravel如何安装Breeze扩展包_Laravel用户注册登录功能快速实现【流程】  jimdo怎样用html5做选项卡_jimdo选项卡html5实现与切换效果【指南】  JavaScript中的标签模板是什么_它如何扩展字符串功能  极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?  网站制作软件有哪些,制图软件有哪些?  Gemini手机端怎么发图片_Gemini手机端发图方法【步骤】  js实现点击每个li节点,都弹出其文本值及修改  个人摄影网站制作流程,摄影爱好者都去什么网站?  如何快速搭建FTP站点实现文件共享?  家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?  详解jQuery中的事件  香港服务器建站指南:免备案优势与SEO优化技巧全解析  Python3.6正式版新特性预览  JS实现鼠标移上去显示图片或微信二维码  如何在建站主机中优化服务器配置?  如何打造高效商业网站?建站目的决定转化率  Linux系统命令中tree命令详解  标题:Vue + Vuex + JWT 身份认证的正确实践与常见误区解析  如何挑选高效建站主机与优质域名?  如何挑选优质建站一级代理提升网站排名?  Laravel模型事件有哪些_Laravel Model Event生命周期详解  详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)  高防服务器如何保障网站安全无虞?  Laravel如何使用Contracts(契约)进行编程_Laravel契约接口与依赖反转  如何正确选择百度移动适配建站域名?  JS去除重复并统计数量的实现方法  laravel服务容器和依赖注入怎么理解_laravel服务容器与依赖注入解析  如何在IIS中新建站点并配置端口与物理路径?  在线制作视频网站免费,都有哪些好的动漫网站?  如何用VPS主机快速搭建个人网站?  bootstrap日历插件datetimepicker使用方法  小米17系列还有一款新机?主打6.9英寸大直屏和旗舰级影像  BootStrap整体框架之基础布局组件  Laravel如何处理文件上传_Laravel Storage门面实现文件存储与管理