欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C# 对象持久化详解

程序员文章站 2023-10-31 12:14:04
对象持久化是指将内存中的对象保存到可永久保存的存储设备中(如磁盘)的一种技术。 本文介绍的是除数据库之外的几种对象持久化方式。 具体如下: 保存成文本:即将内...

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

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

具体如下:

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

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

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

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

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