对象的本地保存

对象的本地保存

对象的创建和保存

对象的特点:

  • 对象“生活”在内存空间中,因此,程序一旦关闭,这些对象也都会被CLR的垃圾回收机制销毁。
  • 程序第二次运行时,对象会以“全新”的状态出现,无法保留上次对象的运行状态。
  • 如果希望第二次运行程序时能“重现”第一次运行时对象的“状态”, 则应用程序就必须采用某种方式将对象的各个属性的值保存到磁盘文件中, 这样在需要时可以从磁盘文件中重新设置对象的各个属性值,典型的方法就是使用文本文件保存对象的各个属性值。

要实现的功能:

  • 将用户信息封装为对象的属性并保存在文本中。
  • 将文本的信息还原成对象的属性并显示出来。
        private void button1_Click(object sender, EventArgs e){Student student = new Student(){Name=textBox1.Text,Age=int.Parse(textBox2.Text),Sex=textBox3.Text,Birth=DateTime.Parse(textBox4.Text),};FileStream fs = new FileStream(@"Student.obj",FileMode.Create);StreamWriter sw =new StreamWriter(fs);sw.WriteLine(student.Name);sw.WriteLine(student.Age);sw.WriteLine(student.Sex);sw.WriteLine(student.Birth);sw.Close();fs.Close();MessageBox.Show("数据保存成功!");}private void button2_Click(object sender, EventArgs e){FileStream fs = new FileStream(@"Student.obj", FileMode.Open);StreamReader sr=new StreamReader(fs);Student student = new Student(){Name = sr.ReadLine(),Age = int.Parse(sr.ReadLine()),Sex = sr.ReadLine(),Birth = DateTime.Parse(sr.ReadLine())};sr.Close();fs.Close();this.textBox1.Text = student.Name;textBox2.Text = student.Age.ToString();textBox3.Text=student.Sex.ToString();textBox4.Text=student.Birth.ToString();}

缺点:针对上面的存储和读取,顺序是比较重要的,一旦下面的读取顺序错乱(就是存储的顺序和读取的顺序不一致),就会导致数据错乱。

如果 student.obj 文件是别人给的,并且里面存储的属性比较多,那么读取起来就比较麻烦。

什么是序列化和反序列化

序列化:序列化是将对象状态转换为可保持或传输的格式的过程,比如转化为二进制、xml、json等的过程。

反序列化:与序列化相对的是反序列化,它将流转换为对象,也就是将在序列化过程中所生成的二进制串、xml、json等转换成数据结构或者对象的过程

序列化的三种方式

二进制序列化

            //序列化//People p1 = new People()//{//    Name = "吴亦凡",//    Age = 20,//    Sex = "男"//};1.创建文件流//FileStream fs = new FileStream(@"1.txt", FileMode.Create);2.创建一个二进制序列化格式器//BinaryFormatter bf = new BinaryFormatter();3.调用序列化格式器的Serialize() 解析p1对象,存入到fs文件流中//bf.Serialize(fs, p1);//fs.Close();//----------------------------------//反序列化FileStream fs = new FileStream(@"1.txt", FileMode.Open);BinaryFormatter bf = new BinaryFormatter();People p1 = (People)bf.Deserialize(fs);fs.Close();Console.WriteLine(p1.Name);

JSON序列化

JSON 全称“JavaScript Object Notation”,译为“JavaScript 对象简谱”或“JavaScript 对象表示法”,是一种轻量级的、基于文本的、开放的数据交换格式。

数据交换是指,两个设备之间建立连接并互相传递数据的过程。

[] 代表数组,{} 代表对象 Name Age代表属性

[ {“Name”:“1”,“Age”:“1”,“NickName”:“1”},{“Name”:“1”,“Age”:“1”,“NickName”:“1”}]

原生方式

  // using System.Runtime.Serialization.Json;      //People p1 = new People()//{//    Name = "吴亦凡",//    Age = 20,//    Sex = "男"//};Json序列化//FileStream fs = new FileStream(@"data.json", FileMode.Create);//DataContractJsonSerializer JsonSer=new DataContractJsonSerializer(typeof(People));//JsonSer.WriteObject(fs, p1);//fs.Close();//Json反序列化FileStream fs = new FileStream(@"data.json", FileMode.Open);DataContractJsonSerializer JsonSer = new DataContractJsonSerializer(typeof(People));People p1=(People) JsonSer.ReadObject(fs);fs.Close();MessageBox.Show(p1.Name);

第三方JsonMapper

1.在程序的引用上右键==>管理Nuget程序包==>浏览标签==>搜索AWSSDK.Core==>找到第一个==>安装//using ThirdParty.Json.LitJson;//People p1 = new People()//{//    Name = "吴亦凡",//    Age = 20,//    Sex = "男"//};序列化//List<People> list=new List<People>();//list.Add(p1);//string jsonstr= JsonMapper.ToJson(list);//FileStream fs = new FileStream(@"data.json", FileMode.Create);//StreamWriter sw=new StreamWriter(fs);//sw.Write(jsonstr);//sw.Close();//fs.Close();//反序列化FileStream fs = new FileStream(@"data.json", FileMode.Open);StreamReader sr=new StreamReader(fs);string JsonStr=sr.ReadToEnd();sr.Close();fs.Close();List<People> list=  JsonMapper.ToObject<List<People>>(JsonStr);MessageBox.Show(list[0].Name);

XML序列化

在网络传输过程中,XML 比较重要,也是一种数据传输格式。在各式各样的程序配置文件中,也经常用 XML 作为配置文件的写法。在 C# 中 XML 也扮演着重要的角色。

什么是 XML

  • XML 是 eXtensible Markup Language 的缩写, 即可扩展标记语言。
  • 它是一种可以用来创建自定义的标记语言,由万维网协会(W3C)创建,用来克服HTML的局限。
  • 从使用功能上看, XML 主要用于数据的存储,而 HTML 主要用于数据显示。

XML 文档的格式要求

  • 确定且唯一的根元素
  • 开始标签和结束标签匹配
  • 元素标签的正确嵌套
  • 属性值要用引号括起来
  • 同一个元素的属性不能重复

XML 语法要求

  • 元素: <标签>文本内容</标签>
  • 处理指令: <?xml version= "1.0"?>
  • 注释: <!--这是一个XML注释-->
  • 属性:<salary currency="US$"> 25000 </salary>

XML 应用示例演示

跨平台数据交互,典型应用就是webservice的使用

常见的we bservice,比如列车时刻表:http://www.webxml.com.cn/WebServices/TrainTimeWebService.asmx

网站配置文件web.config与WinForm应用程序配置文件App.config

			//序列化//People p1 = new People()//{//    Name = "吴亦凡",//    Age = 20,//    Sex = "男"//};//XmlSerializer ser = new XmlSerializer(typeof(People));//FileStream fs = new FileStream(@"people.xml", FileMode.Create);//StreamWriter sw = new StreamWriter(fs);//ser.Serialize(sw, p1);//sw.Close();//fs.Close();//反序列化FileStream fs = new FileStream(@"people.xml", FileMode.Open);StreamReader sr = new StreamReader(fs);XmlSerializer ser = new XmlSerializer(typeof(People));People p1 = (People)ser.Deserialize(sr);sr.Close();fs.Close();MessageBox.Show(p1.Name);

XML 文件的生成

生成 XML 文件

生成 XMLFile1.xml 文件

<?xml version="1.0" encoding="utf-8" ?>
<Students><Student><StuName>高启强</StuName><StuAge>48</StuAge><StuGender>男</StuGender><StuClass>C#一班</StuClass></Student><Student><StuName>孟钰</StuName><StuAge>16</StuAge><StuGender>女</StuGender><StuClass>C#一班</StuClass></Student><Student><StuName>小五</StuName><StuAge>22</StuAge><StuGender>女</StuGender><StuClass>C#二班</StuClass></Student><Student><StuName>安欣</StuName><StuAge>21</StuAge><StuGender>男</StuGender><StuClass>C#三班</StuClass></Student><Student><StuName>赵立冬</StuName><StuAge>23</StuAge><StuGender>男</StuGender><StuClass>C#三班</StuClass></Student><DataInfo><Version versionNum="2.1" pTime="2023-03-28">数据版本信息</Version></DataInfo>
</Students>

然后把编辑好的 XMLFile1.xml 文件,放到 Debug 文件夹中,等待读取。

读取 XML 文件

//节点==元素==标签//xml文件读取的基本操作//1.创建XML文档操作对象XmlDocument xmlDoc = new XmlDocument();//2.加载xml文件到文档对象中xmlDoc.Load(@"XMLFile1.xml");//3.获取xml文档的跟目录XmlNode rootNode=  xmlDoc.DocumentElement;//存储所有的学生信息List<Student> students=new List<Student>();//4.遍历跟节点,获取根节点中所有的节点foreach (XmlNode stuNode in rootNode.ChildNodes){if (stuNode.Name== "Student"){Student stu =new Student();foreach (XmlNode subNode in stuNode.ChildNodes){//根据子节点的名称封装到对象的属性中switch (subNode.Name){case"StuName"://InnerText 获取节点中的文本内容stu.StuName = subNode.InnerText;break;case "StuAge"://InnerText 获取节点中的文本内容stu.StuAge = int.Parse(subNode.InnerText);break;case "StuGender"://InnerText 获取节点中的文本内容stu.StuGender = subNode.InnerText;break;case "StuClass"://InnerText 获取节点中的文本内容stu.StuClass = subNode.InnerText;break;default:break;}}students.Add(stu);}}dataGridView1.DataSource= students;

XML 文件读取总结

常用对象:

  • XmlDocument 对象表示 XML 整个文档
  • XmlNode 对象表示 XML 文件的单个节点

常用属性与说明:

对象属性和方法说明
XmlDocumentDocumentElement属性获取根节点
ChildNodes属性获取所有子节点
Load()方法读取整个XML的结构
XmlNodeInnerText属性当前节点的值
Name属性当前节点的名字
ChildNodes属性当前节点的所有子节点

json 和 xml的区别 : 都是数据格式

1.xml属于重量级别 json是属于轻量级别

2.xml在传输的过程中比较占宽带, json占宽带少

3.xml和json 解析方式不一样,xml使用 XMLDocument类 ,Json解析方式可以使用内置的类和第三方类库

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

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

相关文章

迭代器模式:优雅地遍历数据集合

在软件设计中&#xff0c;迭代器模式是一种常见且有用的设计模式&#xff0c;它允许顺序访问一个聚合对象中的各个元素&#xff0c;而又不暴露该对象的内部表示。这种模式在需要对集合进行遍历操作而又不想暴露集合内部结构的场景下非常有用。 一、迭代器模式的使用条件 访问集…

盘点6个AI绘画免费网站,第一个不仅免费还好用!

随着人工智能技术的前沿发展&#xff0c;人工智能在各个领域发挥了重要作用。人工智能的受欢迎程度不断增加&#xff0c;引起了越来越多的关注。借助动画人工智能生成器&#xff0c;用户可以通过简单的操作获得专业的动画作品&#xff0c;而无需掌握高端技术。今天我们将盘点 1…

golang主要优缺点

优点 1&#xff09;采用协程机制&#xff0c;可以很方便的支持高并发&#xff0c;性能还不错。 2&#xff09;非常易于使用&#xff0c;产出效率很高。 缺点 也是协程机制。程序中一切皆协程&#xff0c;并且自己做了协程调度机制&#xff0c;而不是传统的 线程机制。导致需…

算法学习 -- 多路归并

思想 : 抽象出来一个例子 : 合并k个长度相等升序列表 : 抽象成一张表也就是 : 做法 : 用一个小根堆来维护 &#xff0c; 首先将每个序列的第一个元素放入队列中 &#xff0c; 然后模拟&#xff0c;每次取出队头&#xff0c;作为结果序列的下一个元素 &#xff0c; 然后向堆…

关于java定时任务

cron生成器 corn从左到右&#xff08;用空格隔开&#xff09;&#xff1a;秒 分 小时 月份中的日期 月份 星期中的日期 年份 Seconds Minutes Hours DayofMonth Month DayofWeek Yea Cron表达式范例&#xff1a; 每隔5秒执行一次&#xff1a;*/5 * * * * ? 每隔1分钟执行一次…

系统架构最佳实践 -- 人力资源(E-HR)应用架构设计

当谈到人力资源管理时&#xff0c;电子人力资源&#xff08;E-HR&#xff09;系统已经成为现代企业不可或缺的组成部分。E-HR系统的设计与实践对于提高组织的人力资源管理效率和员工体验至关重要。本文将探讨E-HR应用架构的设计与实践&#xff0c;以及如何借助信息技术优化人力…

第 6 章 Gazebo仿真环境搭建(自学二刷笔记)

6.6.4 Gazebo仿真环境搭建 到目前为止&#xff0c;我们已经可以将机器人模型显示在 Gazebo 之中了&#xff0c;但是当前默认情况下&#xff0c;在 Gazebo 中机器人模型是在 empty world 中&#xff0c;并没有类似于房间、家具、道路、树木... 之类的仿真物&#xff0c;如何在 …

第十四届蓝桥杯C/C++大学B组题解(二)

6、岛屿个数 #include <bits/stdc.h> using namespace std; const int M51; int T,m,n; int vis[M][M],used[M][M]; int dx[]{1,-1,0,0,1,1,-1,-1}; int dy[]{0,0,1,-1,1,-1,1,-1}; string mp[M]; struct node{//记录一点坐标 int x,y; }; void bfs_col(int x,int y){ qu…

springBoot 在过滤器中如何捕获抛出的异常并自定义返回信息 (Filter doFilter)解决方案

在使用 servlet 过滤器时 发现异常报错 不准确&#xff0c;定义的 全局异常处理 好像失效了&#xff0c;过滤器里报错每次都会返回 状态码 &#xff1a;500 错误信息为 “Internal Server Error” 真正的异常只能输出的控制台&#xff0c;抛出不到前端。 问题&#xff1a; 一般…

python实例1.4:模拟用户登录过程(详解及其知识点拓展)

目录 一、主程序及代码分析 二、代码升级,安全优化

Linux安全认证隐匿插件:PAM配置探秘

Linux安全认证隐匿插件&#xff1a;PAM配置探秘 初遇PAM&#xff1a;踏入未知领域 案例&#xff1a; 现网环境升级总是报错端口已被占用&#xff0c;原因是执行升级包中的一条命令时&#xff0c;返回多了一条日志打印&#xff0c;导致升级包中解析命令执行结果错误 当时是第…

【图论】图的存储--链式前向星存图法以及深度优先遍历图

图的存储 介绍 无向图-就是一种特殊的有向图-> 只用考虑有向图的存储即可 有向图 邻接矩阵邻接表 邻接表 存储结构: (为每一个点开了一个单链表,存储这个点可以到达哪个点) 1:3->4->null2:1->4->null3:4->null4:null 插入一条新的边 比如要插一条边&am…

STM32学习和实践笔记(4): 分析和理解GPIO_InitTypeDef GPIO_InitStructure (e)

接上文&#xff0c;继续来看这个函数&#xff1a; /*** brief Initializes the GPIOx peripheral according to the specified* parameters in the GPIO_InitStruct.* param GPIOx: where x can be (A..G) to select the GPIO peripheral.* param GPIO_InitStruct:…

C语言 typedef

C 语言提供了 typedef 关键字&#xff0c;您可以使用它来为类型取一个新的名字。下面的实例为单字节数字定义了一个术语 BYTE&#xff1a; typedef unsigned char BYTE;在这个类型定义之后&#xff0c;标识符 BYTE 可作为类型 unsigned char 的缩写&#xff0c;例如&#xff1…

SpringCloudAlibaba整合

springcloud Alibaba系列整合 1、SpringCloudAlibaba-概述&#xff08;一&#xff09; 2、SpringCloudAlibaba-整合nacos&#xff08;二&#xff09; 3、SpringCloudAlibaba-整合openfeign和loadbalence&#xff08;三&#xff09; 4、SpringCloudAlibaba-整合sentinel&am…

C++ stl容器vector的认识与简单使用

目录 前言&#xff1a; 本篇文档图片引用自&#xff1a;https://cplusplus.com/reference/vector/vector/ 1.vector的结构 2.迭代器类型 3.构造函数 4.迭代器 反向迭代器遍历 const迭代器 5.容量 maxsize shrink_to_fit reverse resize 6.修改 insert和erase 7.…

[C#]OpenCvSharp利用MatchTemplate实现多目标匹配

【效果展示】 原图 模板图 匹配结果&#xff1a; 【实现部分代码】 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using…

单链表专题

文章目录 目录1. 链表的概念及结构2. 实现单链表2.1 链表的打印2.2 链表的尾插2.3 链表的头插2.4 链表的尾删2.5 链表的头删2.6 查找2.7 在指定位置之前插入数据2.8 在指定位置之后插入数据2.9 删除pos节点2.10 删除pos之后的节点2.11 销毁链表 3. 链表的分类 目录 链表的概念…

苹果电脑怎么彻底删除软件 苹果电脑卸载软件在哪里 cleanmymac x怎么卸载 mac废纸篓怎么删除

苹果电脑卸载软件的方法相对直观和简单&#xff0c;尤其是对于习惯使用Mac操作系统的用户来说。以苹果MacBook Pro为例&#xff0c;以下是卸载软件的详细步骤、使用方法、注意事项与建议。 一、卸载软件的详细步骤&#xff1a; 1. 打开Mac电脑&#xff0c;进入桌面&#xff0c…

React面试

React渲染流程(重点) jsx描述界面 jsx babel render function>vdom vdom fiber 在进行渲染 vdom 转换fiber reconcile 转换过程创建dom commit 到domvdom React Element 对象, 只记录了子节点, 没有记录兄弟节点, 因为渲染不可中断 fiber fiberNode 对象, 是一个链表 父节…