C# 对象持久化详解
发布时间 - 2026-01-10 23:00:49 点击率:次对象持久化是指将内存中的对象保存到可永久保存的存储设备中(如磁盘)的一种技术。

本文介绍的是除数据库之外的几种对象持久化方式。
具体如下:
- 保存成文本:即将内存对象以字节流的方式保存到文本中。
- 序列化成Xml:即将对象以Xml的格式存储。
- 序列化成Json:即将对象序列化成Json对象,然后存储。
- 序列化成二进制:即将对象序列化成二进制字节流保存到文件中。
涉及知识点:
- 序列化与反序列化
- 文件流的读写
- 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门面实现文件存储与管理
下一篇:laravel程序包多大
下一篇:laravel程序包多大

