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

【C#/Java】【小白必看】不要只会读写文本文件了!对象序列化助你提高效率

【C#/Java】【小白必看】不要只会读写文本文件了!对象序列化助你提高效率

​ 在编程的世界里,文件的读写操作是我们经常面对的任务之一。
​ 当我们只涉及简单的文本文件时,这个任务似乎并不复杂。但是,当我们处理更为复杂的类对象时,逐个字段进行读取和写入会显得非常繁琐。更为严峻的是,当类的字段发生变化时,我们需要同时修改读取和写入模块,而且还要考虑与原有版本文件的兼容性。

1. 为什么需要对象序列化?

​ 在面对复杂的类结构时,逐个字段进行读取和写入是非常不便利的。这种方式容易导致代码的冗长和维护的困难。而对象序列化则能够将整个对象保存到文件中,不仅减少了代码量,还提高了代码的可维护性。此外,对象序列化还能够解决不同版本之间的兼容性问题,使得在类结构发生变化时,我们仍然能够正确地读取旧版本的文件。

例子:个人信息的存取

​ 设想一下,当我们开发一个系统时,需要对个人信息进行保存。刚开始只有用户名、密码、邮箱,可随着系统越来越完善,所含有的变量也越来越多,这时候如果还是按照原有的思路,一个变量一个变量进行读写,很有可能产生遗漏,且代码庞杂不美观。

​ 我们以一个包含多个字段的PersonalInfo类为例,展示逐个字段读写和对象序列化之间的对比。

以C#为例:

首先,我们看一下逐个字段读写的示例:

using System;
using System.Diagnostics;
using System.IO;class Program
{class PersonalInfo{public string UserName { get; set; }public string Email { get; set; }public string Password { get; set; }public int Level { get; set; }public string Avatar { get; set; }public string Signature { get; set; }// ... 可能还有其他字段 ...}static void Main(){PersonalInfo person = new PersonalInfo{UserName = "JohnDoe",Email = "john@example.com",Password = "securepassword",Level = 3,Avatar = "avatar.jpg",Signature = "Hello, world!"// ... 其他字段的初始化 ...};Stopwatch stopwatch = new Stopwatch();// 逐个字段写入using (StreamWriter writer = new StreamWriter("person.txt")){stopwatch.Start();writer.WriteLine(person.UserName);writer.WriteLine(person.Email);writer.WriteLine(person.Password);writer.WriteLine(person.Level);writer.WriteLine(person.Avatar);writer.WriteLine(person.Signature);// ... 其他字段的写入 ...stopwatch.Stop();}Console.WriteLine($"逐个字段写入耗时:{stopwatch.ElapsedMilliseconds} 毫秒");// 重新初始化 PersonalInfo 对象person = new PersonalInfo();// 逐个字段读取using (StreamReader reader = new StreamReader("person.txt")){stopwatch.Restart();person.UserName = reader.ReadLine();person.Email = reader.ReadLine();person.Password = reader.ReadLine();person.Level = int.Parse(reader.ReadLine());person.Avatar = reader.ReadLine();person.Signature = reader.ReadLine();// ... 其他字段的读取 ...stopwatch.Stop();}Console.WriteLine($"逐个字段读取耗时:{stopwatch.ElapsedMilliseconds} 毫秒");}
}

接下来,我们看一下对象序列化的示例:

using System;
using System.Diagnostics;
using System.IO;
using Newtonsoft.Json;class Program
{class PersonalInfo{public string UserName { get; set; }public string Email { get; set; }public string Password { get; set; }public int Level { get; set; }public string Avatar { get; set; }public string Signature { get; set; }// ... 可能还有其他字段 ...}static void Main(){PersonalInfo person = new PersonalInfo{UserName = "JohnDoe",Email = "john@example.com",Password = "securepassword",Level = 3,Avatar = "avatar.jpg",Signature = "Hello, world!"// ... 其他字段的初始化 ...};Stopwatch stopwatch = new Stopwatch();// 对象序列化stopwatch.Start();string json = JsonConvert.SerializeObject(person);File.WriteAllText("person.json", json);stopwatch.Stop();Console.WriteLine($"对象序列化耗时:{stopwatch.ElapsedMilliseconds} 毫秒");// 重新初始化 PersonalInfo 对象person = new PersonalInfo();// 对象反序列化stopwatch.Restart();string jsonString = File.ReadAllText("person.json");PersonalInfo deserializedPerson = JsonConvert.DeserializeObject<PersonalInfo>(jsonString);stopwatch.Stop();Console.WriteLine($"对象反序列化耗时:{stopwatch.ElapsedMilliseconds} 毫秒");}
}

​ 通过上述例子,我们可以清晰地看到,使用对象序列化的代码更加简洁、清晰,并且不需要关心逐个字段的读写细节

​ 特别是在处理大型复杂对象时,对象序列化的优势更为明显。这种方式可以提高代码的可读性,减少冗余操作,并确保在类结构发生变化时仍能正确处理文件的读写操作

2. C#中的对象序列化

​ 在C#中,我们常用的对象序列化工具是Newtonsoft.Json。该工具提供了强大而灵活的功能,使得对象序列化变得异常简单。下面通过一个例子来说明:

// 定义一个示例类
public class PersonalInfo
{public string UserName { get; set; }public string Email { get; set; }public string Password { get; set; }public int Level { get; set; }public string Avatar { get; set; }public string Signature { get; set; }// ... 其他字段 ...
}// 对象序列化示例
PersonalInfo person = new PersonalInfo
{UserName = "JohnDoe",Email = "john@example.com",Password = "securepassword",Level = 3,Avatar = "avatar.jpg",Signature = "Hello, world!"// ... 其他字段的初始化 ...
};string json = JsonConvert.SerializeObject(person);
File.WriteAllText("person.json", json);// 对象反序列化示例
string jsonString = File.ReadAllText("person.json");
PersonalInfo deserializedPerson = JsonConvert.DeserializeObject<PersonalInfo>(jsonString);

3. Java中的对象序列化

​ 在Java中,我们使用Object流来实现对象的序列化。下面是一个简单的Java示例:

import java.io.*;// 定义一个示例类
class PersonalInfo implements Serializable {String userName;String email;String password;int level;String avatar;String signature;// ... 其他字段 ...// 构造函数public PersonalInfo(String userName, String email, String password, int level, String avatar, String signature) {this.userName = userName;this.email = email;this.password = password;this.level = level;this.avatar = avatar;this.signature = signature;// ... 其他字段的初始化 ...}
}// 对象序列化示例
PersonalInfo person = new PersonalInfo("JohnDoe", "john@example.com", "securepassword", 3, "avatar.jpg", "Hello, world!");try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.ser"))) {oos.writeObject(person);
}// 对象反序列化示例
try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.ser"))) {PersonalInfo deserializedPerson = (PersonalInfo) ois.readObject();
}

4.结语

​ 通过以上示例,我们清晰地展示了对象序列化的威力。在处理类结构较为庞大的情况下,对象序列化能够使代码更加简洁、可读性更强,同时保证了不同版本之间的兼容性。不妨尝试使用对象序列化,提高你的代码效率,让读写操作变得更加轻松!

相关文章:

【C#/Java】【小白必看】不要只会读写文本文件了!对象序列化助你提高效率

【C#/Java】【小白必看】不要只会读写文本文件了&#xff01;对象序列化助你提高效率 ​ 在编程的世界里&#xff0c;文件的读写操作是我们经常面对的任务之一。 ​ 当我们只涉及简单的文本文件时&#xff0c;这个任务似乎并不复杂。但是&#xff0c;当我们处理更为复杂的类对…...

排障启示录-无线终端信号弱

现象&#xff1a;无线终端显示信号弱 信息收集&#xff1a; AP的实际发射功率低。外置天线型AP&#xff0c;天线松动或者没插天线现场环境问题&#xff0c;信号穿透衰减终端接入远端AP终端个体问题 排查步骤&#xff1a; 1、AP的发射功率低 查看AP的射频功率&#xff0c;判…...

gem5 RubyPort: mem_request_port作用与连接 simple-MI_example.py

简介 回答这个问题&#xff1a;RubyPort的口下&#xff0c;一共定义了六个口&#xff0c;分别是mem_request_port&#xff0c;mem_response_port&#xff0c;pio_request_port&#xff0c;pio_response_port&#xff0c;in_ports, interrupt_out_ports&#xff0c;他们分别有什…...

无人机支持的空中无蜂窝大规模MIMO系统中上行链路分布式检测

无人机支持的空中无蜂窝大规模MIMO系统中上行链路分布式检测 无人机支持的空中无蜂窝大规模MIMO系统中上行链路分布式检测介绍题目一. 背景&#xff08;解决的问题&#xff09;二. 系统模型信道模型信道系数进行标准化 信道估计 和 数据传输信道估计上行数据传输 三. 具体的流程…...

文献速递:生成对抗网络医学影像中的应用—— CG-3DSRGAN:用于从低剂量PET图像恢复图像质量的分类指导的3D生成对抗网络

文献速递&#xff1a;生成对抗网络医学影像中的应用—— CG-3DSRGAN&#xff1a;用于从低剂量PET图像恢复图像质量的分类指导的3D生成对抗网络 本周给大家分享文献的主题是生成对抗网络&#xff08;Generative adversarial networks, GANs&#xff09;在医学影像中的应用。文献…...

前端验收测试驱动开发

我们听说过很多关于测试驱动开发&#xff08;TDD&#xff09;的内容。那么什么是ATDD&#xff1f; ATDD代表验收测试驱动开发&#xff0c;这是一种定义验收标准并创建自动化测试来验证是否满足这些标准的软件开发方法。ATDD是一种协作方法&#xff0c;涉及客户、开发人员和测试…...

图像卷积操作

目录 一、互相关运算 二、卷积层 三、图像中目标的边缘检测 四、学习卷积核 五、特征映射和感受野 一、互相关运算 严格来说&#xff0c;卷积层是个错误的叫法&#xff0c;因为它所表达的运算其实是互相关运算&#xff08;cross-correlation&#xff09;&#xff0c;而不是…...

目标检测入门体验,技术选型,加载数据集、构建机器学习模型、训练并评估

Hi, I’m Shendi 1、目标检测入门体验&#xff0c;技术选型&#xff0c;加载数据集、构建机器学习模型、训练并评估 在最近有了个物体识别的需求&#xff0c;于是开始学习 在一番比较与询问后&#xff0c;最终选择 TensorFlow。 对于编程语言&#xff0c;我比较偏向Java或nod…...

【UE5插件推荐】运行时,通过HTTP / HTTPS下载文件(Runtime Files Downloader)

UE5 github Home gtreshchev/RuntimeFilesDownloader Wiki (github.com)...

信息论安全与概率论

目录 一. Markov不等式 二. 选择引理 三. Chebyshev不等式 四. Chernov上限 4.1 变量大于 4.2 变量小于 信息论安全中会用到很多概率论相关的上界&#xff0c;本文章将梳理几个论文中常用的定理&#xff0c;重点关注如何理解这些定理以及怎么用。 一. Markov不等式 假定…...

各种不同语言分别整理的拿来开箱即用的8个开源免费单点登录(SSO)系统

各种不同语言分别整理的拿来开箱即用的8个开源免费单点登录&#xff08;SSO&#xff09;系统。 单点登录&#xff08;SSO&#xff09;是一个登录服务层&#xff0c;通过一次登录访问多个应用。使用SSO服务可以提高多系统使用的用户体验和安全性&#xff0c;用户不必记忆多个密…...

Netty Review - 优化Netty通信:如何应对粘包和拆包挑战

文章目录 概述Pre概述场景复现解决办法概览方式一&#xff1a; 特殊分隔符分包 &#xff08;演示Netty提供的众多方案中的一种&#xff09;流程分析 方式二&#xff1a; 发送长度(推荐) DelimiterBasedFrameDecoder 源码分析 概述 Pre Netty Review - 借助SimpleTalkRoom初体验…...

vue介绍以及基本指令

目录 一、vue是什么 二、使用vue的准备工作 三、创建vue项目 四、vue插值表达式 五、vue基本指令 六、key的作用 七、v-model 九、指令修饰符 一、vue是什么 Vue是一种用于构建用户界面的JavaScript框架。它可以帮助开发人员构建单页应用程序和复杂的前端应用程序。Vue…...

重塑数字生产力体系,生成式AI将开启云计算未来新十年?

科技云报道原创。 今天我们正身处一个历史的洪流&#xff0c;一个巨变的十字路口。生成式AI让人工智能技术完全破圈&#xff0c;带来了机器学习被大规模采用的历史转折点。 它掀起的新一轮科技革命&#xff0c;远超出我们今天的想象&#xff0c;这意味着一个巨大的历史机遇正…...

JFreeChart 生成图表,并为图表标注特殊点、添加文本标识框

一、项目场景&#xff1a; Java使用JFreeChart库生成图片&#xff0c;主要场景为将具体的数据 可视化 生成曲线图等的图表。 本篇文章主要针对为数据集生成的图表添加特殊点及其标识框。具体包括两种场景&#xff1a;x轴为 时间戳 类型和普通 数值 类型。&#xff08;y轴都为…...

vue整合axios 未完

一、简介 1、介绍 axios前端异步请求库类似jouery ajax技术&#xff0c;axios用来在前端页面发起一个异步请求&#xff0c;请求之后页面不动&#xff0c;响应回来刷新页面局部&#xff1b;Axios 是一个基于 promise 的 HTTP 库&#xff0c;可以用在浏览器和 node.js 中 2、特…...

java代码编写twitter授权登录

在上一篇内容已经介绍了怎么申请twitter开放的API接口。 下面介绍怎么通过twitter提供的API&#xff0c;进行授权登录功能。 开发者页面设置 首先在开发者页面开启“用户认证设置”&#xff0c;点击edit进行信息编辑。 我的授权登录是个网页&#xff0c;并且只需要进行简单的…...

​ SK Ecoplant借助亚马逊云科技,海外服务器为环保事业注入新活力

在当今全球面临着资源紧缺和环境挑战的大背景下&#xff0c;数字技术所依赖的海外服务器正成为加速循环经济转型的关键利器。然而&#xff0c;很多企业在整合数字技术到运营中仍然面临着一系列挑战&#xff0c;依然存在低效流程导致的不必要浪费。针对这一问题&#xff0c;SK E…...

RPC(5):AJAX跨域请求处理

接上一篇RPC&#xff08;4&#xff09;&#xff1a;HttpClient实现RPC之POST请求进行修改。 1 修改客户端项目 1.1 修改maven文件 修改后配置文件如下&#xff1a; <dependencyManagement><dependencies><dependency><groupId>org.springframework.b…...

用大白话举例子讲明白区块链

什么是区块链&#xff1f;网上这么说&#xff1a; 区块链是一种分布式数据库技术&#xff0c;它以块的形式记录和存储交易数据&#xff0c;并使用密码学算法保证数据的安全性和不可篡改性。每个块都包含了前一个块的哈希值和自身的交易数据&#xff0c;形成了一个不断增长的链条…...

国防科技大学计算机基础课程笔记02信息编码

1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制&#xff0c;因此这个了16进制的数据既可以翻译成为这个机器码&#xff0c;也可以翻译成为这个国标码&#xff0c;所以这个时候很容易会出现这个歧义的情况&#xff1b; 因此&#xff0c;我们的这个国…...

K8S认证|CKS题库+答案| 11. AppArmor

目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作&#xff1a; 1&#xff09;、切换集群 2&#xff09;、切换节点 3&#xff09;、切换到 apparmor 的目录 4&#xff09;、执行 apparmor 策略模块 5&#xff09;、修改 pod 文件 6&#xff09;、…...

【Java学习笔记】Arrays类

Arrays 类 1. 导入包&#xff1a;import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序&#xff08;自然排序和定制排序&#xff09;Arrays.binarySearch()通过二分搜索法进行查找&#xff08;前提&#xff1a;数组是…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端

&#x1f31f; 什么是 MCP&#xff1f; 模型控制协议 (MCP) 是一种创新的协议&#xff0c;旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议&#xff0c;它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

【机器视觉】单目测距——运动结构恢复

ps&#xff1a;图是随便找的&#xff0c;为了凑个封面 前言 在前面对光流法进行进一步改进&#xff0c;希望将2D光流推广至3D场景流时&#xff0c;发现2D转3D过程中存在尺度歧义问题&#xff0c;需要补全摄像头拍摄图像中缺失的深度信息&#xff0c;否则解空间不收敛&#xf…...

微服务商城-商品微服务

数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...

EtherNet/IP转DeviceNet协议网关详解

一&#xff0c;设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络&#xff0c;本网关连接到EtherNet/IP总线中做为从站使用&#xff0c;连接到DeviceNet总线中做为从站使用。 在自动…...

前端开发面试题总结-JavaScript篇(一)

文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包&#xff08;Closure&#xff09;&#xff1f;闭包有什么应用场景和潜在问题&#xff1f;2.解释 JavaScript 的作用域链&#xff08;Scope Chain&#xff09; 二、原型与继承3.原型链是什么&#xff1f;如何实现继承&a…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)

参考官方文档&#xff1a;https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java&#xff08;供 Kotlin 使用&#xff09; 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

Java 二维码

Java 二维码 **技术&#xff1a;**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...