完整教程:c#数据持久化:TXT文本保存、序列化与反序列化

news/2025/12/7 10:40:00/文章来源:https://www.cnblogs.com/gccbuaa/p/19317745

一、什么是数据持久化

是指将内存中的对象数据保存到存储介质(如文件、数据库)的过程,以便后续重新读取使用。当我们关闭应用程序后,内存中的数据会丢失,而持久化技术可以确保数据长期保存。本文介绍三种实现数据持久化的方法:文本文件保存、二进制序列化和JSON序列化,

为什么需要数据持久化?想象一下,你要进行产品计数。如果没有持久化功能,每次程序关闭后,所有计数数据都会丢失,再次打开又是从0开始计数。而通过持久化技术,这些数据可以永久保存,方便后续查询和修改

之前写的demo在序列化部分使用了已过时且不安全的BinaryFormatter。下面是 System.Text.Json 进行重构的版本,

二、准备工作:创建项目和界面

做一个车辆生产管理的记录模块

在这里插入图片描述

车型:[txtName]       保存文本:[bitSavetxt]
生产日期:[txtManufacture] 读取文本:[btnReadtxt]
车号:[txtID]           JSON序列化:[btnSerializable]
结果:[txtResult]       JSON反序列化:[btnDeserializable]

三、创建数据模型类

数据模型类是持久化的基础,定义要保存数据的结构。

public class Cars
{
public string Name { get; set; }
public string Result { get; set; }
public short ID { get; set; }
public DateTime Manufacture { get; set; }
}

四、方法一:文本文件保存与读取

文本文件保存是最基础的数据持久化方式,它将对象的各个属性转换为文本格式,逐行保存到文件中。

保存到文本文件

private void bitSavetxt_Click(object sender, EventArgs e)
{
// 封装数据:从界面文本框获取数据并创建Cars对象
Cars objCars = new Cars()
{
Name = this.txtName.Text.Trim(),
Result = this.txtResult.Text.Trim(),
ID = Convert.ToInt16(this.txtID.Text.Trim()),
Manufacture = Convert.ToDateTime(this.txtManufacture.Text.Trim())
};
// 使用using语句自动管理资源,确保文件流正确关闭
// 
try
{
using (FileStream fs = new FileStream("objCars.txt", FileMode.Create))
using (StreamWriter sw = new StreamWriter(fs))
{
// 将对象属性逐行写入文件
sw.WriteLine(objCars.Name);
sw.WriteLine(objCars.Manufacture);
sw.WriteLine(objCars.ID);
sw.WriteLine(objCars.Result);
}
MessageBox.Show("数据保存成功!");
}
catch (IOException ex) // 捕获文件操作可能出现的IOException[10](@ref)
{
MessageBox.Show($"文件操作错误:{ex.Message}");
}
catch (Exception ex) // 捕获其他异常
{
MessageBox.Show($"发生错误:{ex.Message}");
}
}

从文本文件读取

// 从文本文件读取
private void btnReadtxt_Click(object sender, EventArgs e)
{
if (!File.Exists("objCars.txt"))
{
MessageBox.Show("文件不存在,请先保存数据。");
return;
}
try
{
using (FileStream fs = new FileStream("objCars.txt", FileMode.Open))
using (StreamReader sr = new StreamReader(fs, Encoding.UTF8)) // 指定编码,与写入一致
{
Cars objCars = new Cars();
// 读取并赋值,顺序必须与写入时完全一致
objCars.Name = sr.ReadLine() ?? ""; // 处理可能读取到null的情况
string manufactureString = sr.ReadLine();
string idString = sr.ReadLine();
objCars.Result = sr.ReadLine() ?? "";
// 安全地转换日期和数字
if (DateTime.TryParse(manufactureString, out DateTime manufactureDate))
{
objCars.Manufacture = manufactureDate;
}
else
{
MessageBox.Show("生产日期格式不正确,使用默认值(现在日期)。");
objCars.Manufacture = DateTime.Now; // 设置当前日期为默认值
}
if (short.TryParse(idString, out short id))
{
objCars.ID = id;
}
else
{
MessageBox.Show("编号格式不正确,无法解析,使用默认值!");
objCars.ID = 1; //设置 ID 默认值为1
}
// 将读取的数据显示在界面
this.txtName.Text = objCars.Name;
this.txtManufacture.Text = objCars.Manufacture.ToLongDateString();
this.txtID.Text = objCars.ID.ToString();
this.txtResult.Text = objCars.Result;
}
}
catch (Exception ex)
{
MessageBox.Show($"读取文件时发生错误:{ex.Message}");
}
}

文本保存优缺点:

优点:生成的文件人类可读,易于调试和手动修改

缺点:需要手动处理每个属性的保存和读取(要注意顺序),数据类型转换容易出错

五、方法二:JSON序列化(.NET官方推荐使用)

JSON序列化是最常用的方法,它生成我们可读的文本格式,且安全性高,使用System.Text.Json库。

引入System.Text.Json命名空间
确保你的项目已引用System.Text.Json(.NET Core 3.0+或.NET 5+以上版本默认包含,不用添加)。

JSON序列化实现

private void btnSerializable_Click(object sender, EventArgs e)
{
try
{
// 封装数据
Cars objCars = new Cars()
{
Name = this.txtName.Text.Trim(),
Result = this.txtResult.Text.Trim(),
ID = Convert.ToInt16(this.txtID.Text.Trim()),
Manufacture = Convert.ToDateTime(this.txtManufacture.Text.Trim())
};
// 创建JSON序列化选项,配置缩进以便阅读
var options = new JsonSerializerOptions
{
WriteIndented = true
};
// 使用System.Text.Json将对象序列化为JSON字符串
string jsonString = JsonSerializer.Serialize(objCars, options);
// 将JSON字符串写入文件
File.WriteAllText("objCars.json", jsonString);
MessageBox.Show("JSON序列化成功!");
}
catch (Exception ex)
{
MessageBox.Show($"序列化过程中发生错误:{ex.Message}");
}
}

JSON反序列化实现

private void btnDeserializable_Click(object sender, EventArgs e)
{
try
{
// 检查文件是否存在
if (!File.Exists("objCars.json"))
{
MessageBox.Show("未找到JSON文件,请先执行序列化操作。");
return;
}
// 从文件中读取JSON字符串
string jsonString = File.ReadAllText("objCars.json");
// 将JSON字符串反序列化为Cars对象
Cars objCars = JsonSerializer.Deserialize<Cars>(jsonString);// 将数据显示在界面this.txtName.Text = objCars.Name;this.txtManufacture.Text = objCars.Manufacture.ToLongDateString();this.txtID.Text = objCars.ID.ToString();this.txtResult.Text = objCars.Result;MessageBox.Show("JSON反序列化成功!");}catch (JsonException jsonEx){MessageBox.Show($"反序列化失败,JSON格式错误:{jsonEx.Message}");}catch (Exception ex){MessageBox.Show($"反序列化过程中发生错误:{ex.Message}");}}

六、方法三:XML序列化(备选方案)

XML序列化是另一种常用的序列化方式,特别适用于需要与旧系统交互或需要严格数据结构的场景。

XML序列化实现

private void btnXmlSerialize_Click(object sender, EventArgs e)
{
try
{
// 封装数据
Cars objCars = new Cars()
{
Name = this.txtName.Text.Trim(),
Result = this.txtResult.Text.Trim(),
ID = Convert.ToInt16(this.txtID.Text.Trim()),
Manufacture = Convert.ToDateTime(this.txtManufacture.Text.Trim())
};
// 创建XmlSerializer实例
XmlSerializer serializer = new XmlSerializer(typeof(Cars));
// 序列化到文件
using (FileStream stream = new FileStream("objCars.xml", FileMode.Create))
{
serializer.Serialize(stream, objCars);
}
MessageBox.Show("XML序列化成功!");
}
catch (Exception ex)
{
MessageBox.Show($"XML序列化过程中发生错误:{ex.Message}");
}
}

XML反序列化实现

private void btnXmlDeserialize_Click(object sender, EventArgs e)
{
try
{
if (!File.Exists("objCars.xml"))
{
MessageBox.Show("未找到XML文件,请先执行XML序列化操作。");
return;
}
// 创建XmlSerializer实例
XmlSerializer serializer = new XmlSerializer(typeof(Cars));
// 从XML文件反序列化
using (FileStream stream = new FileStream("objCars.xml", FileMode.Open))
{
Cars objCars = (Cars)serializer.Deserialize(stream);
// 更新界面
this.txtName.Text = objCars.Name;
this.txtManufacture.Text = objCars.Manufacture.ToLongDateString();
this.txtID.Text = objCars.ID.ToString();
this.txtResult.Text = objCars.Result;
}
MessageBox.Show("XML反序列化成功!");
}
catch (Exception ex)
{
MessageBox.Show($"XML反序列化过程中发生错误:{ex.Message}");
}
}
}

总结:

简单数据且不考虑安全的情况下,txt实现最简单,其他场景推荐JSON,XML做备选。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/991248.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025年热门的薄抽同步隐藏轨/全拉同步隐藏轨TOP品牌厂家排行榜

2025年热门的薄抽同步隐藏轨/全拉同步隐藏轨TOP品牌厂家排行榜行业背景与市场趋势随着现代家居设计理念的不断升级,消费者对家具五金配件的功能性、美观性和耐用性要求越来越高。薄抽同步隐藏轨和全拉同步隐藏轨作为高…

实用指南:基于微信小程序的粤语文化传播系统

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

如何选择靠谱的咖啡豆合作工厂?2025年最新行业趋势与五家实力厂商推荐

在精品咖啡消费持续升温与连锁品牌加速扩张的双重驱动下,2025年的咖啡供应链正经历一场深刻的专业化与规模化变革。无论是计划创立独立品牌的创业者,还是寻求稳定优质货源的连锁门店或跨境电商,选择一家可靠的咖啡豆…

完整教程:指针,数组,变量

完整教程:指针,数组,变量pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco",…

2025年度有实力的空气能十大品牌推荐:看哪家品牌售后服务优

空气能热泵作为双碳目标下的核心清洁供暖技术,2024年市场规模突破620亿元,年增速达38%。但行业痛点显著:低温环境制热效率衰减超40%、核心部件进口依赖度达65%、市场鱼龙混杂导致用户投诉率年增22%。用户层面更面临…

2025年评价高的洁净室吊顶FFU龙骨实力厂家TOP推荐榜

2025年评价高的洁净室吊顶FFU龙骨实力厂家TOP推荐榜行业背景与市场趋势随着半导体、生物医药、电子制造等高科技产业的快速发展,洁净室作为关键生产环境的需求持续增长。作为洁净室核心组成部分的吊顶FFU龙骨系统,其…

2025年知名的抽屉阻尼托底轨/反弹阻尼托底轨厂家推荐及选购指南

2025年知名的抽屉阻尼托底轨/反弹阻尼托底轨厂家推荐及选购指南行业背景与市场趋势随着家居五金行业的快速发展,抽屉阻尼托底轨和反弹阻尼托底轨作为现代家具的核心配件,其市场需求持续增长。2025年,随着智能家居和…

2025年知名的缓冲隐藏轨厂家实力及用户口碑排行榜

2025年知名的缓冲隐藏轨厂家实力及用户口碑排行榜行业背景与市场趋势随着家居五金行业的快速发展,缓冲隐藏轨作为现代家具的核心配件之一,其市场需求持续增长。2025年,全球家具五金市场规模预计将达到280亿美元,其…

2025年口碑好的电缆桥架小桥架/大跨距电缆桥架最新TOP厂家排名

2025年口碑好的电缆桥架/大跨距电缆桥架TOP厂家排名行业背景与市场趋势随着我国基础设施建设的持续投入和工业领域的快速发展,电缆桥架作为电力、通信、建筑等行业的重要配套产品,市场需求呈现稳定增长态势。2025年,…

河北唐山市滦南县农村自建房公司深度测评,滦南县地区靠谱自建房公司权威度对比排行榜

河北唐山市滦南县农村自建房公司深度测评,滦南县地区靠谱自建房公司权威度对比排行榜 一、引言:渤海湾畔建房事,选对伙伴安终身 “倴城古镇旁怎么盖既抗海风又合规矩的房?”“南堡滩涂边的宅基地,地基该怎么打才牢…

2025年度浙江省专升本机构TOP5权威测评:老牌机构与口碑

专升本考试竞争白热化的2024年,浙江省专升本报名人数突破15万,同比增长22%,但市场上68%的考生遭遇过师资参差督学形式化等痛点——某调研显示,53%考生认为机构赠送资料冗余过时,58%反映课程与自身基础不匹配。面对…

2025年知名的两轴自动滚丝机厂家最新热销排行

2025年知名的两轴自动滚丝机厂家热销排行 行业背景与市场趋势 随着制造业的持续升级,滚丝机作为金属加工领域的重要设备,广泛应用于标准件、汽车零部件、建筑紧固件等行业。近年来,两轴自动滚丝机因其高效、稳定、…

在河北唐山市滦南县老家农村盖房子,自建房公司哪家靠谱?滦南县靠谱自建房公司TOP6实用选择指南

在河北唐山市滦南县老家农村盖房子,自建房公司哪家靠谱?滦南县靠谱自建房公司TOP6实用选择指南 一、引言 十年前,滦南县农村盖房还停留在“找本村工匠、画简易草图”的粗放模式。从北部倴城镇周边的冲积平原砖瓦房,…

河北唐山滦南县农村自建房口碑推荐排行榜 2026年滦南县自建房公司权威测评优选

河北唐山滦南县农村自建房口碑推荐排行榜 2026年滦南县自建房公司权威测评优选 一、引言:滦南农村自建房的“专业化转型” 在渤海湾畔的滦南县,农村自建房始终承载着渔家的记忆与农耕的情怀。这片孕育了评剧、皮影、…

2025年知名的多媒体沙盘模型厂家最新TOP排行榜

2025年知名的多媒体沙盘模型厂家TOP排行榜行业背景与市场趋势随着数字化技术的快速发展,多媒体沙盘模型行业正经历着前所未有的变革。2025年,这一行业已从传统的静态展示向智能化、交互式方向发展,融合了AR/VR技术、…

2025年质量好的镀锌钢格栅排水沟厂家最新实力排行

2025年质量好的镀锌钢格栅排水沟厂家实力排行行业背景与市场趋势随着城市化进程的加快和基础设施建设的不断推进,镀锌钢格栅排水沟作为重要的排水设施,在市政工程、工业园区、交通枢纽等领域的需求持续增长。2025年,…

在天津市武清区老家农村盖房子,靠谱的自建房公司口碑推荐。天津市武清区自建房公司/机构权威测评推荐排行榜

在天津市武清区老家农村盖房子,靠谱的自建房公司口碑推荐。天津市武清区自建房公司/机构权威测评推荐排行榜 一、引言 十年前,天津市武清区农村盖房还停留在“找本村工匠、画简易草图”的粗放模式。从永定河、龙凤河…

天津市武清区农村自建房找谁好?天津市武清区自建房公司/机构深度评测口碑推荐榜

天津市武清区农村自建房找谁好?天津市武清区自建房公司/机构深度评测口碑推荐榜 一、引言:武清区农村自建房的“专业化转型” 天津市武清区地处京津冀腹地,北接北京通州,南邻天津市区,京杭大运河穿境而过,既有“…

2025年知名的风管包裹防火板用户好评厂家排行

2025年知名的风管包裹防火板用户好评厂家排行行业背景与市场趋势随着建筑行业对消防安全要求的不断提高,风管包裹防火板作为建筑通风系统中的关键防火构件,其市场需求持续增长。2024年,中国建筑防火材料市场规模已达…

2025年靠谱的胸针铆钉机厂家最新TOP排行榜

2025年靠谱的胸针铆钉机厂家TOP排行榜行业背景与市场趋势随着全球饰品、徽章和标牌行业的持续增长,胸针铆钉机作为关键生产设备,市场需求呈现稳步上升态势。2025年,中国制造业智能化转型加速,自动化设备在饰品生产…