本文以一个简单的小例子,简述对象持久化的相关知识,仅供学习分享使用,如有不足之处,还请指正。

概述

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

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

具体如下:

  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('=')[], lineInfo.Split('=')[]);
}
}
}
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# 对象持久化的更多相关文章

  1. 如何一步一步用DDD设计一个电商网站(九)—— 小心陷入值对象持久化的坑

    阅读目录 前言 场景1的思考 场景2的思考 避坑方式 实践 结语 一.前言 在上一篇中(如何一步一步用DDD设计一个电商网站(八)—— 会员价的集成),有一行注释的代码: public interfa ...

  2. 《精通Hibernate:Java对象持久化技术详解》目录

    图书信息:孙卫琴 电子工业出版社 第1章 Java应用分层架构及软件模型: 1.1 应用程序的分层体系结构 1.1.1 区分物理层和逻辑层 1.1.2 软件层的特征 1.1.3 软件分层的优点 1.1 ...

  3. Hibernate学习之对象持久化

    1.  对象持久化 对象的持久化就是把内存中对象形式的业务数据,转换成数据库中的关系数据形式的业务数据.广义理解,对象的持久化还包括内存与关系数据库之交换业务数据的各种操作. 2. 对象持久化模式 1 ...

  4. Hibernate对象持久化框架

    JDBC:(Java Data Base Connectivity)java数据库连接 java.sql包提供JDBC API,可通过它编写訪问数据库的程序代码.当中经常使用的接口和类包含以下内容: ...

  5. (转)Hibernate框架基础——Java对象持久化概述

    http://blog.csdn.net/yerenyuan_pku/article/details/52732990 Java对象持久化概述 应用程序的分层体系结构 基于B/S的典型三层架构  说明 ...

  6. 怎么搭建Hibernate对象持久化框架?

    DBC:(Java Data Base Connectivity)java数据库连接 java.sql包提供JDBC API,可通过它编写访问数据库的程序代码.其中常用的接口和类包括下面内容: Dri ...

  7. 学习ORM框架—hibernate(三):跟踪持久化对象状态,掌握对象持久化

    准备工作 在上篇博客中学习ORM框架—hibernate(一):初识hibernate,通过简单的实例说明O和R的映射过程.本篇博客将要介绍hibernate中持久化对象的状态,并使用hibernat ...

  8. Pickle模块数据对象持久化操作

    Pickle模块的作用是持久化(序列化)的储存数据.因此我先解释下:什么是序列化与反序列化.什么是对象序列化和对象反序列化.通俗地讲,它们的定义如下:序列化: 把一个对象保存到一个文件或数据库字段中去 ...

  9. Hibernate对象持久化的三种状态

    1.三种状态: public static void testSel() { Session session = HibernateUtils.openSession(); Transaction t ...

随机推荐

  1. Xamarin.Android 解决打开软键盘导致底部菜单上移问题

    在界面布局中有EditText控件,该控件一旦获取焦点则打开软键盘,如果布局中有底部菜单,那么底部菜单可能会被软键盘顶在其上面,看如下效果: 解决方法:在活动绑定界面之前写上下段代码即可 Window ...

  2. npm jspdf报错

    137073 warn optional SKIPPING OPTIONAL DEPENDENCY: fsevents@^1.2.2 (node_modules\chokidar\node_modul ...

  3. java正则表达式的忽略大小写

    (?i)abc 表示abc都忽略大小写  a(?i)bc 表示bc忽略大小写  a((?i)b)c 表示只有b忽略大小写

  4. Python机器学习笔记:XgBoost算法

    前言 1,Xgboost简介 Xgboost是Boosting算法的其中一种,Boosting算法的思想是将许多弱分类器集成在一起,形成一个强分类器.因为Xgboost是一种提升树模型,所以它是将许多 ...

  5. SpringMVC学习(一)———— springmvc框架原理分析和简单入门程序

    一.什么是springmvc? 我们知道三层架构的思想,并且如果你知道ssh的话,就会更加透彻的理解这个思想,struts2在web层,spring在中间控制,hibernate在dao层与数据库打交 ...

  6. vue+vue-router+vuex实战

    shopping vue + vue-router + vuex实现电商网站 效果展示 install 下载代码: git clone https://github.com/chenchangyuan ...

  7. Go基础系列:defer、panic和recover

    defer关键字 defer关键字可以让函数或语句延迟到函数语句块的最结尾时,即即将退出函数时执行,即便函数中途报错结束.即便已经panic().即便函数已经return了,也都会执行defer所推迟 ...

  8. [转]分别使用Node.js Express 和 Koa 做简单的登录页

    本文转自:https://blog.csdn.net/weixin_38498554/article/details/79204240 刚刚学了Koa2,由于学的不是很深,并没有感受到网上所说的Koa ...

  9. Linux学习笔记之Django项目部署(CentOS)

    一.引入 用Django写了一个测试的项目,现在要部署在Linux上,一般这种情况下,只要在项目里面敲一行命令:python manage.py runserver 0.0.0.0:8000就行了.但 ...

  10. vue IE 报错 引用babel-polyfill

    一.vue 项目报错 vuex requires a Promise polyfill in this browser     在网上找到下面三篇文章,然而和我的项目都不太一样. 我的项目基于 基础模 ...