当前位置: 首页 > news >正文

对象的本地保存

对象的本地保存

对象的创建和保存

对象的特点:

  • 对象“生活”在内存空间中,因此,程序一旦关闭,这些对象也都会被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解析方式可以使用内置的类和第三方类库

相关文章:

对象的本地保存

对象的本地保存 对象的创建和保存 对象的特点&#xff1a; 对象“生活”在内存空间中&#xff0c;因此&#xff0c;程序一旦关闭&#xff0c;这些对象也都会被CLR的垃圾回收机制销毁。程序第二次运行时&#xff0c;对象会以“全新”的状态出现,无法保留上次对象的运行状态。…...

PostgreSQL入门到实战-第二十一弹

PostgreSQL入门到实战 PostgreSQL中表连接操作(五)官网地址PostgreSQL概述PostgreSQL中RIGHT JOIN命令理论PostgreSQL中RIGHT JOIN命令实战更新计划 PostgreSQL中表连接操作(五) 使用PostgreSQL RIGHT JOIN连接两个表&#xff0c;并从右表返回行 官网地址 声明: 由于操作系统…...

李彦宏放话:百度AI大模型绝不抢开发者饭碗

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 昨晚&#xff0c;李彦宏内部讲话称&#xff1a;AI大模型开源意义不大&#xff0c;百度绝不抢开发者饭碗。 但你一定要说话算话哦&#xff0c;可千万别说&#xff1a;“我永远不做手机&#xff0c;谁再敢提做手机就给…...

es 倒排索引

es 倒排索引TRee 倒排索引树&#xff08;TRee&#xff09;通常指的是Elasticsearch中用于支持高速搜索的一种数据结构。它是一种树状结构&#xff0c;可以通过特定的词项&#xff08;terms&#xff09;来快速定位包含这些词项的文档。 在Elasticsearch中&#xff0c;倒排索引…...

阿里云服务器公网带宽费用全解析(不同计费模式)

阿里云服务器公网带宽怎么收费&#xff1f;北京地域服务器按固定带宽计费一个月23元/M&#xff0c;按使用流量计费0.8元/GB&#xff0c;云服务器地域不同实际带宽价格也不同&#xff0c;阿里云服务器网aliyunfuwuqi.com分享不同带宽计费模式下带宽收费价格表&#xff1a; 公网…...

python-pytorch实现lstm模型预测文本输出0.1.00

python-pytorch实现lstm模型预测文本输出0.1.00 数据参考效果分词到数组准备数数据查看频次获取vacab生成输入数据训练测试连续预测有问题还需要完善 数据 一篇新闻:https://news.sina.com.cn/c/2024-04-12/doc-inarqiev0222543.shtml 参考 https://blog.csdn.net/qq_1953…...

77、WAF攻防——权限控制代码免杀异或运算变量覆盖混淆加密传参

文章目录 WAF规则webshell免杀变异 WAF规则 函数匹配 工具指纹 webshell免杀变异 php 传参带入 eval可以用assert来替换,assert也可以将字符串当作php代码执行漏洞 php 变量覆盖 php 加密 使用加密算法对php后门进行加密 php 异或运算 简化:无字符webshellP 无数字字母rc…...

A12 STM32_HAL库函数 之 HAL-ETH通用驱动 -- A -- 所有函数的介绍及使用

A12 STM32_HAL库函数 之 HAL-ETH通用驱动 -- A -- 所有函数的介绍及使用 1 通用定时器&#xff08;TIM&#xff09;预览1.1 HAL_ETH_Init1.2 HAL_ETH_DeInit1.3 HAL_ETH_DMATxDescListInit1.4 HAL_ETH_DMARxDescListInit1.5 HAL_ETH_MspInit1.6 HAL_ETH_MspDeInit1.7 HAL_ETH_T…...

Linux从入门到精通 --- 1.初始Linux

文章目录 第一章&#xff1a;1.1 Linux的诞生1.2 Linux系统内核1.3 Linux系统发行版 第一章&#xff1a; 1.1 Linux的诞生 1991年由林纳斯 托瓦兹创立并发展至今称为服务器操作系统领域的核心系统。 1.2 Linux系统内核 Linux内核提供了系统的主要功能&#xff0c;甚至是开源…...

linux使用docker实现redis主从复制和哨兵模式

目录 1. 拉取redis镜像 2.使用可视化redis工具 3. 设置从redis 4.设置哨兵模式 5. 使用docker-compose快速创建 1. 拉取redis镜像 docker pull redis 默认拉取最新的镜像。 然后pull结束后使用docker images检查镜像&#xff1a; 然后docker run创建container容器 首先…...

新版chrome 解决在http协议下无法调用摄像头和麦克风的问题(不安全)

解决办法&#xff1a;亲测可行 chrome浏览器地址栏中输入chrome://flags/#unsafely-treat-insecure-origin-as-secure&#xff0c;回车&#xff0c;如下图&#xff0c;将该选项置为Enabled&#xff0c; edge浏览器打开&#xff1a;edge://flags/#unsafely-treat-insecure-orig…...

机器学习入门项目二(逻辑回归)

如果输入数据长度为2&#xff0c;上一章的方程就无法满足需求了&#xff0c;需要修改方程&#xff1a; z w 1 x w 2 y b zw_1xw_2yb zw1​xw2​yb 数据产生器&#xff1a; import matplotlib.pyplot as plt import numpy as npclass DataGenerator2Input:"""…...

C++类引用的好处

简化代码&#xff1a;引用可以简化代码&#xff0c;使其更加易读和易懂。通过使用引用&#xff0c;可以避免在函数参数中复制大型对象&#xff0c;从而提高代码的效率和性能。 传递大型对象的效率高&#xff1a;使用引用作为函数参数传递大型对象时&#xff0c;不需要进行对象…...

从零自制docker-9-【管道实现run进程和init进程传参】

文章目录 命令行中输入参数长度过长匿名管道从父进程到子进程传参[]*os.File{}os.NewFile和io.ReadAllexe.LookPathsyscall.Execstrings.Split(msgStr, " ")/bin/ls: cannot access : No such file or directory代码 命令行中输入参数长度过长 用户输入参数过长或包…...

全量知识系统 程序详细设计 之 三种“活物” 之1(QA百度搜索 )

Q1. 今天聊聊 全知系统中 三种“活物”。先从他们的一个简单描述开始&#xff1a; 自主&#xff1a;计算机“集群”的“沉”与“浮”&#xff1b; 自然&#xff1a;AI “众生”的“世”和“界” &#xff1b;自由&#xff1a;人类 “公民”的“宇”或“宙”。 全知系统中的三…...

QT 线程之movetothread

上文列举了qt中线程的几种方法&#xff0c;其中2种方法最为常见。 这两种方法都少不了QThread类&#xff0c;前者继承于QThread类&#xff0c;后者复合QThread类。 本文以实例的方式描述了movetothread&#xff08;&#xff09;这种线程的方法&#xff0c;将QObject的子类移动…...

如何处理ubuntu22.04LTS安装过程中出现“Daemons using outdated libraries”提示

Ubuntu 22.04 LTS 中使用命令行升级软件或安装任何新软件时&#xff0c;您可能收到“Daemons using outdated libraries”&#xff0c;“Which services should be restarted?”的提示&#xff0c;提示下面列出备选的重启服务&#xff0c;如下。 使用以下命令&#xff0c;能够…...

跟TED演讲学英文:The inside story of ChatGPT‘s astonishing potential by Greg Brockman

The inside story of ChatGPT’s astonishing potential Link: https://www.ted.com/talks/greg_brockman_the_inside_story_of_chatgpt_s_astonishing_potential Speaker: Greg Brockman Date:April 2023 文章目录 The inside story of ChatGPTs astonishing potentialIntro…...

mybatis05:复杂查询:(多对一,一对多)

mybatis05&#xff1a;复杂查询&#xff1a;&#xff08;多对一&#xff0c;一对多&#xff09; 文章目录 mybatis05&#xff1a;复杂查询&#xff1a;&#xff08;多对一&#xff0c;一对多&#xff09;前言&#xff1a;多对一 &#xff1a; 关联 &#xff1a; 使用associatio…...

微电网优化:基于肝癌算法(Liver Cancer algorithm, LCA)的微电网优化(提供MATLAB代码)

一、微电网优化模型 微电网是一个相对独立的本地化电力单元&#xff0c;用户现场的分布式发电可以支持用电需求。为此&#xff0c;您的微电网将接入、监控、预测和控制您本地的分布式能源系统&#xff0c;同时强化供电系统的弹性&#xff0c;保障您的用电更经济。您可以在连接…...

VUE_H5页面跳转第三方地图导航,兼容微信浏览器

当前项目是uniapp项目&#xff0c;若不是需要替换uni.showActionSheet选择api onMap(address , organName , longitude 0, latitude 0){var ua navigator.userAgent.toLowerCase();var isWeixin ua.indexOf(micromessenger) ! -1;if(isWeixin) {const mapUrl_tx "…...

智慧安全运营:智能化运维,确保服务无忧

智慧安全运营&#xff1a;智能化运维&#xff0c;确保服务无忧 中国联通新一代全球智云数据中心采用先进的智能化运维管理系统&#xff0c;实现对数据中心设施、IT设备、能源消耗、环境参数等全方位、实时监控。通过物联网技术、人工智能算法以及大数据分析&#xff0c;运维团…...

R-tree总结

引言&#xff1a; 在处理空间数据和地理信息系统&#xff08;GIS&#xff09;中&#xff0c;高效的空间索引机制对于提升查询性能至关重要。R-tree是一种流行的平衡树数据结构&#xff0c;专门用于索引多维信息&#xff0c;如二维的地理坐标或三维的物体位置。它以其灵活性、高…...

Python 与机器学习,在服务器使用过程中,常用的 Linux 命令包括哪些?

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 本博客旨在分享在实际开发过程中&#xff0c;开发者需要了解并熟练运用的 Linux 操作系统常用命令。Linux 作为一种操作系统&#xff0c;与 Windows 或 MacOS 并驾齐驱&#xff0c;尤其在服务器和开发环…...

js通过Object.defineProperty实现数据响应式

目录 数据响应式属性描述符propertyResponsive 依赖收集依赖队列寻找依赖 观察器 派发更新Observer完整代码关于数据响应式关于Object.defineProperty的限制 数据响应式 假设我们现在有这么一个页面 <!DOCTYPE html> <html lang"en"><head><m…...

docker最简单教程(使用dockerfile构建环境)

一 手里有的东西 安装好的docker+dockerfile 二 操作 只需要在你的dockerfile文件下执行命令 docker build -t="xianhu/centos:gitdir" . 将用户名、操作系统和tag进行修改就可以了,这就相当于在你本地安装了一个docker环境,然后执行 docker run -it xianhu/ce…...

Vue2 —— 学习(三)

目录 一、绑定 class 样式 &#xff08;一&#xff09;字符串写法 1.流程介绍 2.代码实现 &#xff08;二&#xff09;数组写法 1.流程介绍 2.代码实现 &#xff08;三&#xff09;对象写法 1.流程介绍 2.代码实现 二、绑定 style 样式&#xff08;了解&#xff…...

Qt Creator 12.0.2 debug 无法查看变量的值 Expression too Complex

鼠标放在局部变量上提示“expression too complex”。 在调试窗口也看不到局部变量的值。 这应该是qt的一个bug&#xff0c;https://bugreports.qt.io/browse/QTCREATORBUG-24180 暂时解决方法&#xff1a; 如下图&#xff0c;需要右键项目然后执行"Clean"和&quo…...

LeetCode-Java:303、304区域检索(前缀和)

文章目录 题目303、区域和检索&#xff08;数组不可变&#xff09;304、二维区域和检索&#xff08;矩阵不可变&#xff09; 解①303&#xff0c;一维前缀和②304&#xff0c;二维前缀和 算法前缀和一维前缀和二维前缀和 题目 303、区域和检索&#xff08;数组不可变&#xff…...

出海业务的网络安全挑战

出海业务的扩展带来了巨大的市场机遇&#xff0c;同时也带来了不少网络安全挑战&#xff1a; 数据泄露与隐私保护&#xff1a;跨境数据传输增加了数据被截获和泄露的风险。地理位置限制和审查&#xff1a;某些地区的网络审查和地理位置限制可能阻碍企业正常开展业务。网络攻击…...

关于配色的网站/广州推广工具

会发现这里这两个方法无法重载 因为在 public Integer method(List stringList)&#xff1b;和 public String method(List integers)&#xff1b;中 参数最终都是在编译时候擦除类型 变成List 这样就无法重载了&#xff0c;重载必须方法签名不同...

门户网站建设好处/网络营销模式包括哪些

上一次我们一起重温了JS中数组相关的内容&#xff0c;这一次我们要来学习ES6新引入的两个数据结构&#xff1a;map和set。map和对象比较像&#xff0c;可以用键来获取值&#xff0c;set则和数组比较像&#xff0c;但是不允许出现重复的值。下面我们就进入详细地学习吧&#xff…...

摄影网站备案/网络营销方案模板

职业中专10-11学年度(第二学期)11春幼师 专业《计算机应用基础》学科期中考试试卷出题人王冉冉阅卷人题号一二三四五六七总分一、名词解释(5’315’)1、位&#xff1a;2、ENIAC&#xff1a;3、字长&#xff1a;二、填空(3’515’)1、计算机系统软件包括&#xff1a;支撑软件、_…...

真做视频网站/杭州网站搜索排名

一. Oracle 11g 默认审计说明 之前整理的一篇有关审计的说明&#xff1a; Oracle Audit 审计 说明 http://www.cndba.cn/Dave/article/1469 在Maclean 的blog上看到了2篇介绍Oracle 11g 默认审计的文章&#xff0c;原文链接如下&#xff1a; 11g默认审计选项 http://www.oracl…...

南宁高新区建设房产局网站/企业网站推广方案策划

linux中的进程管理&#xff1a; 查看进程命令&#xff1a; ps &#xff1a;查看应用级别的进程 ps -e&#xff1a; 查看系统应用级的进程 ps -ef &#xff1a;显示进程的全部信息(这个命令经常用) ps -ef|grep 关键字&#xff1a; 查看带有关键字的进程 关闭进程命令&#xff1…...

北京的网站建设公司有哪些/苏州网站制作开发公司

谷歌于2015年正式推出的Kubernetes开源项目目前已经吸引了众多IT公司的关注&#xff0c;这些公司包括Redhat、CoreOS、IBM、惠普等知名IT公司&#xff0c;也包括国内如华为、时速云等公司。为什么Kubernetes会引发这么多公司的关注&#xff1f;最根本的原因是Kubernetes是新一代…...