通过示例解释序列化和反序列化-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条视频…...
固乔快递查询助手:批量、快速、全面的快递信息查询软件
在快递行业飞速发展的今天,如何高效、准确地掌握快递信息成为了很多人的需求。而固乔快递查询助手正是解决这一难题的利器。 固乔快递查询助手是一款专注于快递信息查询的软件,支持多家主流快递公司查询。用户只需输入单号,即可快速查询到实时…...
终极CoreCycler教程:简单三步完成CPU稳定性测试与优化
终极CoreCycler教程:简单三步完成CPU稳定性测试与优化 【免费下载链接】corecycler Script to test single core stability, e.g. for PBO & Curve Optimizer on AMD Ryzen or overclocking/undervolting on Intel processors 项目地址: https://gitcode.com/…...
终极解密指南:Windows平台NCM音频文件一键转换实战
终极解密指南:Windows平台NCM音频文件一键转换实战 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换,Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 你是否曾因网易云音乐的NCM加密格式而烦恼&…...
ncmdumpGUI:3分钟掌握网易云音乐ncm格式转换的终极方案
ncmdumpGUI:3分钟掌握网易云音乐ncm格式转换的终极方案 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换,Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 你是否曾经在网易云音乐下载了心爱的歌曲&a…...
Thorium浏览器深度解析:5个核心优势与进阶配置实战
Thorium浏览器深度解析:5个核心优势与进阶配置实战 【免费下载链接】thorium Chromium fork named after radioactive element No. 90. Source code and Linux releases. Windows/MacOS/ARM builds served in different repos, links are towards the top of the RE…...
基于RAG的Obsidian智能插件:用AI对话重塑个人知识管理
1. 项目概述:当笔记遇上AI,一个插件如何重塑知识管理最近在折腾我的Obsidian知识库时,发现了一个让我眼前一亮的插件:Smart2Brain。这名字起得挺有意思,“Smart to Brain”,直译过来就是“从智能到大脑”。…...
VT.ai:开发者AI工具集实战指南,提升编码效率与调试体验
1. 项目概述:一个面向开发者的AI工具集最近在GitHub上看到一个挺有意思的项目,叫“vinhnx/VT.ai”。乍一看这个标题,可能有点摸不着头脑,但点进去研究一番,你会发现这其实是一个开发者为自己、也为社区打造的一个AI工具…...
【仅限前200名】Midjourney铂金印相专属Prompt库泄露:含17组经暗房验证的--v 6.2参数矩阵与胶片光谱校准模板
更多请点击: https://intelliparadigm.com 第一章:Midjourney铂金印相的光学本质与历史语境 铂金印相(Platinum Print)并非数字时代的产物,而是一种诞生于1873年的古典摄影工艺——其影像由铂族金属(主要是…...
Navis:开源项目标准化开发环境与工具链配置框架实践
1. 项目概述:一个为开发者打造的“导航星图”如果你和我一样,常年混迹在开源项目的海洋里,那么你一定对这种感觉不陌生:面对一个全新的、功能强大的开源工具,兴奋地克隆了仓库,然后……就卡在了第一步。REA…...
开源技能安全仪表盘:从架构解析到CI/CD集成的DevSecOps实践
1. 项目概述:一个面向技能开发者的安全仪表盘最近在折腾一些智能设备上的技能开发,发现一个挺普遍但容易被忽视的问题:我们花大量时间在功能实现和用户体验上,但技能本身的安全性评估,往往只能等到上线后,通…...
NeoPixel光剑制作全攻略:从WS2812B原理到实战装配
1. 项目概述:从零件到光剑的旅程如果你和我一样,是个对《星球大战》里的光剑毫无抵抗力,同时又喜欢动手折腾电子玩意儿的人,那么用NeoPixel灯带自制一把会发光、能变色的光剑,绝对是件充满成就感的事。这不仅仅是把灯塞…...
