通过示例解释序列化和反序列化-Java
序列化和反序列化是Java(以及通常的编程)中涉及将对象转换为字节流,以及反之的过程。当你需要传输或存储对象的状态时特别有用,比如将其通过网络发送或持久化到文件中。
序列化:
- 定义:序列化是将对象的状态(字段和数据)转换为字节流的过程。
- 目的:它允许保存对象的状态,以便以后可以重建它。
- Java接口:SerializableJava中的接口是一个标记接口,表示一个类可以被序列化。
反序列化:
- 定义:反序列化是从字节流重建对象的过程。
- 目的:它允许从保存的状态重新创建原始对象。
- Java 接口:实现的类Serializable应该被反序列化。
用途和实时应用:
-
网络通讯:
-
用例:当需要通过网络在不同应用程序或系统之间发送对象时。
-
示例:客户端-服务器应用程序,其中对象在客户端和服务器之间发送。
import java.io.*;
import java.net.*;public class User implements Serializable {private String username;private transient String password; // Transient fields are not serialized// Constructors, getters, setters...public static void main(String[] args) {// Serialization (Client Side)try (Socket socket = new Socket("server_address", 12345);ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream())) {User user = new User("john_doe", "password123");out.writeObject(user);System.out.println("User object sent to server");} catch (IOException e) {e.printStackTrace();}// Deserialization (Server Side)try (ServerSocket serverSocket = new ServerSocket(12345);Socket clientSocket = serverSocket.accept();ObjectInputStream in = new ObjectInputStream(clientSocket.getInputStream())) {User receivedUser = (User) in.readObject();System.out.println("Received User object: " + receivedUser);} catch (IOException | ClassNotFoundException e) {e.printStackTrace();}}
}
持久化:
- 用例:将对象的状态存储在文件或数据库中,以便以后检索。
- 示例:将用户偏好或游戏状态保存在文件中。
import java.io.*;public class UserPreferences implements Serializable {private String theme;private int fontSize;// Constructors, getters, setters...public static void main(String[] args) {// Serialization (Save Preferences)try (ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("user_preferences.ser"))) {UserPreferences preferences = new UserPreferences("dark", 16);out.writeObject(preferences);System.out.println("User preferences saved to file");} catch (IOException e) {e.printStackTrace();}// Deserialization (Load Preferences)try (ObjectInputStream in = new ObjectInputStream(new FileInputStream("user_preferences.ser"))) {UserPreferences loadedPreferences = (UserPreferences) in.readObject();System.out.println("Loaded User preferences: " + loadedPreferences);} catch (IOException | ClassNotFoundException e) {e.printStackTrace();}}
}
缓存:
- 用例:将对象存储在缓存中,以便快速检索而无需重新创建它们。
- 示例:缓存频繁使用的数据库查询结果。
import java.io.*;
import java.util.HashMap;
import java.util.Map;public class CacheManager implements Serializable {private Map<String, Object> cache = new HashMap<>();// Methods to put, get, and manage the cache...public static void main(String[] args) {// Serialization (Save Cache)try (ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("cache.ser"))) {CacheManager cacheManager = new CacheManager();cacheManager.put("queryResult1", /* database query result */);cacheManager.put("queryResult2", /* another query result */);out.writeObject(cacheManager);System.out.println("Cache saved to file");} catch (IOException e) {e.printStackTrace();}// Deserialization (Load Cache)try (ObjectInputStream in = new ObjectInputStream(new FileInputStream("cache.ser"))) {CacheManager loadedCacheManager = (CacheManager) in.readObject();System.out.println("Loaded Cache: " + loadedCacheManager);} catch (IOException | ClassNotFoundException e) {e.printStackTrace();}}
}
消息队列:
- 用例:在不同组件或微服务之间传递对象。
- 示例:使用消息队列在分布式系统的不同部分之间发送对象。
import java.io.*;
import java.util.Queue;
import java.util.concurrent.ArrayBlockingQueue;public class MessageQueue implements Serializable {private Queue<String> messages = new ArrayBlockingQueue<>(10);// Methods to add, retrieve, and manage messages...public static void main(String[] args) {// Serialization (Save Message Queue)try (ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("message_queue.ser"))) {MessageQueue messageQueue = new MessageQueue();messageQueue.addMessage("Message1");messageQueue.addMessage("Message2");out.writeObject(messageQueue);System.out.println("Message Queue saved to file");} catch (IOException e) {e.printStackTrace();}// Deserialization (Load Message Queue)try (ObjectInputStream in = new ObjectInputStream(new FileInputStream("message_queue.ser"))) {MessageQueue loadedMessageQueue = (MessageQueue) in.readObject();System.out.println("Loaded Message Queue: " + loadedMessageQueue);} catch (IOException | ClassNotFoundException e) {e.printStackTrace();}}
}
远程方法调用(RMI):
- 用例:像调用本地方法一样在远程对象上调用方法。
- 示例:分布式应用程序中,一个机器上的对象需要调用另一个机器上对象的方法。
import java.rmi.*;
import java.rmi.registry.*;public interface RemoteCalculator extends Remote {int add(int a, int b) throws RemoteException;// Other remote methods...
}public class CalculatorImpl implements RemoteCalculator {public int add(int a, int b) throws RemoteException {return a + b;}// Other method implementations...
}public class RmiServer {public static void main(String[] args) {try {RemoteCalculator calculator = new CalculatorImpl();Registry registry = LocateRegistry.createRegistry(1099);Naming.rebind("CalculatorService", calculator);System.out.println("RMI Server is running...");} catch (Exception e) {e.printStackTrace();}}
}public class RmiClient {public static void main(String[] args) {try {RemoteCalculator calculator = (RemoteCalculator) Naming.lookup("rmi://localhost/CalculatorService");int result = calculator.add(5, 10);System.out.println("Result from RMI server: " + result);} catch (Exception e) {e.printStackTrace();}}
}
总之,在Java中,序列化涉及将对象转换为字节流,从而实现其存储或传输;而反序列化则从字节流重构原始对象。这些过程对于诸如将对象状态保存到文件、通过网络发送对象或将数据持久化到数据库等任务至关重要,确保数据能够轻松存储、传输和随后重建。
相关文章:
通过示例解释序列化和反序列化-Java
序列化和反序列化是Java(以及通常的编程)中涉及将对象转换为字节流,以及反之的过程。当你需要传输或存储对象的状态时特别有用,比如将其通过网络发送或持久化到文件中。 序列化: 定义:序列化是将对象的状…...
k8s源码阅读环境配置
源码阅读环境配置 k8s代码的阅读可以让我们更加深刻的理解k8s各组件的工作原理,同时提升我们Go编程能力。 IDE使用Goland,代码阅读环境需要进行如下配置: 从github上下载代码:https://github.com/kubernetes/kubernetes在GOPATH目…...
Java JDBC整合(概述,搭建,PreparedStatement和Statement,结果集处理)
一、JDBC的概述: JDBC:是一种执行sql语句的Java APL,可以为多种关系类型数据库提供统一访问,它由一组用Java语言编写的类和接口组成。有了JDBC,Java人员只需要编写一次程序就可以访问不同的数据库。 JDBC APL…...
Nginx 负载均衡集群 节点健康检查
前言 正常情况下,nginx 做反向代理负载均衡的话,如果后端节点服务器宕掉的话,nginx 默认是不能把这台服务器踢出 upstream 负载集群的,所以还会有请求转发到后端的这台服务器上面,这样势必造成网站访问故障 注&#x…...
uniapp 多轴图,双轴图,指定哪几个数据在哪个轴上显示
这里使用的在这里导入, 秋云 ucharts echarts 高性能跨全端图表组件 - DCloud 插件市场 这里我封装成一个组件,自适应的,可以直接复制到自己的项目中 <template><qiun-data-charts type"mix":opts"opts":cha…...
Kotlin 协程 supervisorScope {} 运行崩溃解决
前言 简单介绍supervisorScope函数,它用于创建一个使用了 SupervisorJob 的 coroutineScope, 该作用域的特点:抛出的异常,不会 连锁取消 同级协程和父协程。 看过很多 supervisorScope {} 文档的使用,我照抄一摸一样…...
【Spring 篇】JdbcTemplate:轻松驾驭数据库的魔法工具
欢迎来到数据库的奇妙世界,在这里,我们将一同揭开Spring框架中JdbcTemplate的神秘面纱。JdbcTemplate是Spring提供的一个简化数据库操作的工具,它为我们提供了一种轻松驾驭数据库的魔法。本篇博客将详细解释JdbcTemplate的基本使用࿰…...
Web开发SpringBoot SpringMVC Spring的学习笔记(包含开发常用工具类)
开发框架学习笔记 一.Spring SpringMVC SpringBoot三者的联系SpringMVC工作原理 二.SpringBoot的学习2.1 注解2.1.1 SpringBoot的核心注解2.1.2 配置导入注解(简化Spring配置写XML的痛苦)Configuration和Bean(人为注册Spring 的 Bean)Import(补)ImportResource(补)AutowiredQua…...
微服务下的SpringSecurity认证端
从三板斧开始微服务下的SpringSecurity开始 一、引入组件包 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-oauth2</artifactId> </dependency> 二、创建适配器 AuthorizationServerConfig…...
苹果电脑菜单栏应用管理软件Bartender 4 mac软件特点
Bartender mac是一款可以帮助用户更好地管理和组织菜单栏图标的 macOS 软件。它允许用户隐藏和重新排列菜单栏图标,从而减少混乱和杂乱。 Bartender mac软件特点 菜单栏图标隐藏:Bartender 允许用户隐藏菜单栏图标,只在需要时显示。这样可以…...
笙默考试管理系统-MyExamTest----codemirror(65)
笙默考试管理系统-MyExamTest----codemirror(65) 目录 一、 笙默考试管理系统-MyExamTest----codemirror 二、 笙默考试管理系统-MyExamTest----codemirror 三、 笙默考试管理系统-MyExamTest----codemirror 四、 笙默考试管理系统-MyExamTest---…...
git在本地创建dev分支并和远程的dev分支关联起来
文章目录 git在本地创建dev分支并和远程的dev分支关联起来1. 使用git命令2. 使用idea2.1 先删除上面建的本地分支dev2.2 通过idea建dev分支并和远程dev分支关联 3. 查看本地分支和远程分支的关系 git在本地创建dev分支并和远程的dev分支关联起来 1. 使用git命令 git checkout…...
【C++】深入了解构造函数之初始化列表
目录 一、再谈构造函数 1、引入 1)构造函数体赋值 2)不同成员变量赋值 2、初始化列表 一、再谈构造函数 1、引入 1)构造函数体赋值 在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值…...
差分--差分数组快速计算L到R值相加后的数组
目录 差分:思路代码: 原题链接 差分: 输入一个长度为 n 的整数序列。 接下来输入 m 个操作,每个操作包含三个整数 l,r,c ,表示将序列中 [l,r] 之间的每个数加上 c 。 请你输出进行完所有操作后的序列。 输入格式 第…...
《NLP入门到精通》栏目导读(01/2)
一、说明 栏目《NLP入门到精通》本着从简到难得台阶式学习过度。将自然语言处理得知识贯穿过来。本栏目得前导栏目是《深度学习》、《pytorch实践》,因此,读者需要一定得深度学习基础,才能过度到此栏目内容。 二、博客建设理念 本博客基地,将建成人工智能领域的参考资料库;…...
three.js实现电子围栏效果(纹理贴图)
three.js实现电子围栏效果(纹理贴图) 实现步骤 围栏的坐标坐标转换为几何体顶点,uv顶点坐标加载贴图,移动 图例 代码 <template><div class"app"><div ref"canvesRef" class"canvas-…...
DHSP和DNS
一、服务程序 1.1DHCP定义 DHCP(动态主机配置协议)是一个局域网的网络协议。指的是由服务器控制一段IP地址范围,客户机登录服务器时就可以自动获得服务器分配的IP地址和子网掩码。默认情况下,DHCP作为Windows Server的一个服务组…...
Python冒号的解释
1. “没什么首次没有为第二个,跳了三个”。它得到的切片序列的每一个第三个项目。 扩展片是你想要的。新在Python 2.3 2. Python的序列切片地址可以写成[开始:结束:一步]和任何启动,停止或结束可以被丢弃。a[::3]是每第三个序列。…...
uniapp微信小程序投票系统实战 (SpringBoot2+vue3.2+element plus ) -后端鉴权拦截器实现
锋哥原创的uniapp微信小程序投票系统实战: uniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )_哔哩哔哩_bilibiliuniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )共计21条视频…...
固乔快递查询助手:批量、快速、全面的快递信息查询软件
在快递行业飞速发展的今天,如何高效、准确地掌握快递信息成为了很多人的需求。而固乔快递查询助手正是解决这一难题的利器。 固乔快递查询助手是一款专注于快递信息查询的软件,支持多家主流快递公司查询。用户只需输入单号,即可快速查询到实时…...
Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...
Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务
通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...
跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...
Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...
基于 TAPD 进行项目管理
起因 自己写了个小工具,仓库用的Github。之前在用markdown进行需求管理,现在随着功能的增加,感觉有点难以管理了,所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD,需要提供一个企业名新建一个项目&#…...
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要: 近期,在使用较新版本的OpenSSH客户端连接老旧SSH服务器时,会遇到 "no matching key exchange method found", "n…...
[ACTF2020 新生赛]Include 1(php://filter伪协议)
题目 做法 启动靶机,点进去 点进去 查看URL,有 ?fileflag.php说明存在文件包含,原理是php://filter 协议 当它与包含函数结合时,php://filter流会被当作php文件执行。 用php://filter加编码,能让PHP把文件内容…...
