C# 对象持久化详解

作者:飞翔的月亮 时间:2023-06-24 10:21:47 

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

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

具体如下:

  1. 保存成文本:即将内存对象以字节流的方式保存到文本中。

  2. 序列化成Xml:即将对象以Xml的格式存储。

  3. 序列化成Json:即将对象序列化成Json对象,然后存储。

  4. 序列化成二进制:即将对象序列化成二进制字节流保存到文件中。

涉及知识点:

  1. 序列化与反序列化

  2. 文件流的读写

  3. ListView显示复选框,并横向排列

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

C# 对象持久化详解

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


/// <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);
 }

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

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

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

来源:http://www.cnblogs.com/hsiang/p/6392333.html

标签:C#,对象
0
投稿

猜你喜欢

  • Android RecyclerView显示Item布局不一致解决办法

    2023-04-25 06:50:32
  • C++高并发内存池的整体设计和实现思路

    2023-07-03 16:29:31
  • spring boot整合redis主从sentinel方式

    2021-10-01 20:13:47
  • c#多进程通讯的实现示例

    2022-09-06 02:43:23
  • Android内存优化杂谈

    2023-06-18 15:46:41
  • 详解Java线程同步器CountDownLatch

    2023-08-23 18:42:39
  • Java基于TCP方式的二进制文件传输

    2023-06-04 18:23:52
  • C#遍历DataSet控件实例总结

    2022-11-13 15:22:36
  • java如何实现自动生成数据库设计文档

    2023-08-07 19:01:28
  • Unity多屏幕设置的具体方案

    2023-12-12 12:05:24
  • C#中的多线程多参数传递详解

    2023-08-02 22:23:46
  • Android代码检查规则Lint的自定义与应用详解

    2021-11-04 22:13:43
  • springboot中@Value的工作原理说明

    2023-08-24 04:48:49
  • java 安全 ysoserial CommonsCollections6 分析

    2021-06-04 01:58:14
  • RegexOptions.IgnoreCase正则表达式替换,忽略大小写

    2022-05-03 17:25:45
  • Java 并发编程之线程挂起、恢复与终止

    2022-02-18 11:51:51
  • C#使用iTextSharp操作PDF

    2023-07-29 02:03:11
  • Android开发之自动朗读TTS用法分析

    2021-08-21 22:31:00
  • SpringMVC路径匹配中使用通配符问题

    2023-07-18 20:44:03
  • Android编程使用LinearLayout和PullRefreshView实现上下翻页功能的方法

    2023-06-30 02:16:15
  • asp之家 软件编程 m.aspxhome.com