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

通过示例解释序列化和反序列化-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&#xff08;以及通常的编程&#xff09;中涉及将对象转换为字节流&#xff0c;以及反之的过程。当你需要传输或存储对象的状态时特别有用&#xff0c;比如将其通过网络发送或持久化到文件中。 序列化&#xff1a; 定义&#xff1a;序列化是将对象的状…...

k8s源码阅读环境配置

源码阅读环境配置 k8s代码的阅读可以让我们更加深刻的理解k8s各组件的工作原理&#xff0c;同时提升我们Go编程能力。 IDE使用Goland&#xff0c;代码阅读环境需要进行如下配置&#xff1a; 从github上下载代码&#xff1a;https://github.com/kubernetes/kubernetes在GOPATH目…...

Java JDBC整合(概述,搭建,PreparedStatement和Statement,结果集处理)

一、JDBC的概述&#xff1a; JDBC&#xff1a;是一种执行sql语句的Java APL&#xff0c;可以为多种关系类型数据库提供统一访问&#xff0c;它由一组用Java语言编写的类和接口组成。有了JDBC&#xff0c;Java人员只需要编写一次程序就可以访问不同的数据库。 JDBC APL&#xf…...

Nginx 负载均衡集群 节点健康检查

前言 正常情况下&#xff0c;nginx 做反向代理负载均衡的话&#xff0c;如果后端节点服务器宕掉的话&#xff0c;nginx 默认是不能把这台服务器踢出 upstream 负载集群的&#xff0c;所以还会有请求转发到后端的这台服务器上面&#xff0c;这样势必造成网站访问故障 注&#x…...

uniapp 多轴图,双轴图,指定哪几个数据在哪个轴上显示

这里使用的在这里导入&#xff0c; 秋云 ucharts echarts 高性能跨全端图表组件 - DCloud 插件市场 这里我封装成一个组件&#xff0c;自适应的&#xff0c;可以直接复制到自己的项目中 <template><qiun-data-charts type"mix":opts"opts":cha…...

Kotlin 协程 supervisorScope {} 运行崩溃解决

前言 简单介绍supervisorScope函数&#xff0c;它用于创建一个使用了 SupervisorJob 的 coroutineScope&#xff0c; 该作用域的特点&#xff1a;抛出的异常&#xff0c;不会 连锁取消 同级协程和父协程。 看过很多 supervisorScope {} 文档的使用&#xff0c;我照抄一摸一样…...

【Spring 篇】JdbcTemplate:轻松驾驭数据库的魔法工具

欢迎来到数据库的奇妙世界&#xff0c;在这里&#xff0c;我们将一同揭开Spring框架中JdbcTemplate的神秘面纱。JdbcTemplate是Spring提供的一个简化数据库操作的工具&#xff0c;它为我们提供了一种轻松驾驭数据库的魔法。本篇博客将详细解释JdbcTemplate的基本使用&#xff0…...

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 软件。它允许用户隐藏和重新排列菜单栏图标&#xff0c;从而减少混乱和杂乱。 Bartender mac软件特点 菜单栏图标隐藏&#xff1a;Bartender 允许用户隐藏菜单栏图标&#xff0c;只在需要时显示。这样可以…...

笙默考试管理系统-MyExamTest----codemirror(65)

笙默考试管理系统-MyExamTest----codemirror&#xff08;65&#xff09; 目录 一、 笙默考试管理系统-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&#xff09;构造函数体赋值 2&#xff09;不同成员变量赋值 2、初始化列表 一、再谈构造函数 1、引入 1&#xff09;构造函数体赋值 在创建对象时&#xff0c;编译器通过调用构造函数&#xff0c;给对象中各个成员变量一个合适的初始值…...

差分--差分数组快速计算L到R值相加后的数组

目录 差分&#xff1a;思路代码&#xff1a; 原题链接 差分&#xff1a; 输入一个长度为 n 的整数序列。 接下来输入 m 个操作&#xff0c;每个操作包含三个整数 l,r,c &#xff0c;表示将序列中 [l,r] 之间的每个数加上 c 。 请你输出进行完所有操作后的序列。 输入格式 第…...

《NLP入门到精通》栏目导读(01/2)

一、说明 栏目《NLP入门到精通》本着从简到难得台阶式学习过度。将自然语言处理得知识贯穿过来。本栏目得前导栏目是《深度学习》、《pytorch实践》,因此,读者需要一定得深度学习基础,才能过度到此栏目内容。 二、博客建设理念 本博客基地,将建成人工智能领域的参考资料库;…...

three.js实现电子围栏效果(纹理贴图)

three.js实现电子围栏效果&#xff08;纹理贴图&#xff09; 实现步骤 围栏的坐标坐标转换为几何体顶点&#xff0c;uv顶点坐标加载贴图&#xff0c;移动 图例 代码 <template><div class"app"><div ref"canvesRef" class"canvas-…...

DHSP和DNS

一、服务程序 1.1DHCP定义 DHCP&#xff08;动态主机配置协议&#xff09;是一个局域网的网络协议。指的是由服务器控制一段IP地址范围&#xff0c;客户机登录服务器时就可以自动获得服务器分配的IP地址和子网掩码。默认情况下&#xff0c;DHCP作为Windows Server的一个服务组…...

Python冒号的解释

1. “没什么首次没有为第二个&#xff0c;跳了三个”。它得到的切片序列的每一个第三个项目。 扩展片是你想要的。新在Python 2.3 2. Python的序列切片地址可以写成[开始&#xff1a;结束&#xff1a;一步]和任何启动&#xff0c;停止或结束可以被丢弃。a[::3]是每第三个序列。…...

uniapp微信小程序投票系统实战 (SpringBoot2+vue3.2+element plus ) -后端鉴权拦截器实现

锋哥原创的uniapp微信小程序投票系统实战&#xff1a; uniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )_哔哩哔哩_bilibiliuniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )共计21条视频…...

固乔快递查询助手:批量、快速、全面的快递信息查询软件

在快递行业飞速发展的今天&#xff0c;如何高效、准确地掌握快递信息成为了很多人的需求。而固乔快递查询助手正是解决这一难题的利器。 固乔快递查询助手是一款专注于快递信息查询的软件&#xff0c;支持多家主流快递公司查询。用户只需输入单号&#xff0c;即可快速查询到实时…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器

一.自适应梯度算法Adagrad概述 Adagrad&#xff08;Adaptive Gradient Algorithm&#xff09;是一种自适应学习率的优化算法&#xff0c;由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率&#xff0c;适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

Linux简单的操作

ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...

相机从app启动流程

一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

【C语言练习】080. 使用C语言实现简单的数据库操作

080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

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

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

css3笔记 (1) 自用

outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size&#xff1a;0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格&#xff…...

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要&#xff1a; 近期&#xff0c;在使用较新版本的OpenSSH客户端连接老旧SSH服务器时&#xff0c;会遇到 "no matching key exchange method found"​, "n…...

多模态图像修复系统:基于深度学习的图片修复实现

多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...

华为OD机试-最短木板长度-二分法(A卷,100分)

此题是一个最大化最小值的典型例题&#xff0c; 因为搜索范围是有界的&#xff0c;上界最大木板长度补充的全部木料长度&#xff0c;下界最小木板长度&#xff1b; 即left0,right10^6; 我们可以设置一个候选值x(mid)&#xff0c;将木板的长度全部都补充到x&#xff0c;如果成功…...