当前位置: 移动技术网 > IT编程>开发语言>c# > C# 对象持久化详解

C# 对象持久化详解

2019年07月18日  | 移动技术网IT编程  | 我要评论

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

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

具体如下:

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

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

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

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

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

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网