【Java序列化】使用Java 自带的Serializer进行对象序列化和反序列化

在Java开发中,对象序列化和反序列化是常见的需求。序列化是指将对象的状态转换为字节流,从而可以将其存储到文件中或通过网络进行传输。反序列化则是这个过程的逆操作,即将字节流重新转换为对象。Java标准库提供了ObjectOutputStreamObjectInputStream类来实现这些功能。本文将介绍如何使用这些类来实现一个简单的序列化工具类JdkSerializer

JdkSerializer类的实现

首先,我们需要创建一个实现了Serializable接口的类JdkSerializer。这个接口是一个标记接口,用于指示某个类的对象可以被序列化。虽然JdkSerializer类本身不需要直接实现任何方法,但实现这个接口是序列化类的标准做法。

以下是JdkSerializer类的实现:

import java.io.*;  public class JdkSerializer implements Serializable {  // 序列化方法  public <T> byte[] serialize(T obj) throws IOException {  ByteArrayOutputStream out = new ByteArrayOutputStream();  ObjectOutputStream objectOutputStream = new ObjectOutputStream(out);  objectOutputStream.writeObject(obj);  objectOutputStream.close();  return out.toByteArray();  }  // 反序列化方法  public <T> T deserialize(byte[] bytes) throws IOException {  ByteArrayInputStream in = new ByteArrayInputStream(bytes);  ObjectInputStream objectInputStream = new ObjectInputStream(in);  try {  return (T)objectInputStream.readObject();  } catch(ClassNotFoundException e) {  throw new RuntimeException(e);  } finally {  objectInputStream.close();  }  }  
}

序列化方法

serialize方法接收一个泛型对象T作为参数,并返回一个字节数组。这个方法的实现步骤如下:

  1. 创建一个ByteArrayOutputStream实例,用于存储序列化后的字节流。
  2. 创建一个ObjectOutputStream实例,并将其包装在ByteArrayOutputStream中。
  3. 调用writeObject方法将对象序列化并写入到ByteArrayOutputStream中。
  4. 关闭ObjectOutputStream(注意:在实际应用中,应该使用try-with-resources语句来自动关闭流,这里为了简洁起见省略了)。
  5. 返回ByteArrayOutputStream中的字节数组。

反序列化方法

deserialize方法接收一个字节数组作为参数,并返回一个泛型对象T。这个方法的实现步骤如下:

  1. 创建一个ByteArrayInputStream实例,并将字节数组作为输入。
  2. 创建一个ObjectInputStream实例,并将其包装在ByteArrayInputStream中。
  3. 调用readObject方法从ObjectInputStream中读取对象,并将其转换为泛型类型T
  4. 捕获ClassNotFoundException异常,并将其包装为一个RuntimeException抛出。这是因为如果在反序列化过程中找不到对象的类定义,则无法正确创建对象。
  5. finally块中关闭ObjectInputStream

使用示例

以下是一个简单的使用示例,展示了如何使用JdkSerializer类来序列化和反序列化一个对象:

public class Main {  public static void main(String[] args) {  try {  JdkSerializer serializer = new JdkSerializer();  // 创建一个对象  Person person = new Person("Alice", 30);  // 序列化对象  byte[] serializedPerson = serializer.serialize(person);  System.out.println("Serialized Person: " + Arrays.toString(serializedPerson));  // 反序列化对象  Person deserializedPerson = serializer.deserialize(serializedPerson);  System.out.println("Deserialized Person: " + deserializedPerson);  } catch (IOException e) {  e.printStackTrace();  }  }  
}  class Person implements Serializable {  private String name;  private int age;  public Person(String name, int age) {  this.name = name;  this.age = age;  }  @Override  public String toString() {  return "Person{name='" + name + "', age=" + age + "}";  }  
}

 

在这个示例中,我们定义了一个Person类,并实现了Serializable接口。然后,我们使用JdkSerializer类来序列化和反序列化一个Person对象。

注意事项

  1. 安全性:序列化和反序列化过程可能会引发安全问题,因为反序列化过程中会执行字节流中的代码。因此,在反序列化不可信的数据时,需要特别注意安全性。
  2. 版本兼容性:在序列化和反序列化过程中,对象的类定义必须保持一致。如果类的定义发生了变化(例如,添加或删除了字段),则可能会导致反序列化失败或数据不一致。
  3. 性能:序列化和反序列化过程可能会消耗较多的时间和资源,特别是在处理大型对象或复杂对象图时。因此,在性能敏感的场景中,需要谨慎使用。

通过本文的介绍,你应该已经了解了如何使用Java标准库中的ObjectOutputStreamObjectInputStream类来实现一个简单的序列化工具类JdkSerializer。希望这个工具类能够帮助你在实际开发中更加高效地处理对象的序列化和反序列化。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/438352.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python编写的贪吃蛇小游戏

安装包 pip install pygame完整代码 import pygame import randompygame.init()# 定义颜色 white (255, 255, 255) black (0, 0, 0) red (213, 50, 80) green (0, 255, 0) blue (50, 153, 213)# 定义屏幕大小 dis_width 800 dis_height 600dis pygame.display.set_mo…

探索TOGAF理论的实践应用:企业数字化转型的深度指南

数字化转型的迫切性与路径选择 随着全球化进程和技术革命的加速&#xff0c;企业正面临前所未有的挑战和机遇。数字化转型已成为企业保持竞争力、创新业务模式、优化客户体验的核心手段。然而&#xff0c;企业在实施数字化转型时&#xff0c;往往面临路径不清、技术与业务脱节…

win系统网络重置

重置网络命令&#xff1a;netsh winsock reset 输入winR 调用运行窗口&#xff0c;回车 输入重置网络命令&#xff1a;netsh winsock reset 注意空格

在Stable Diffusion WebUI中安装SadTalker插件时几种错误提示的处理方法

SD中的插件一般安装比较简单&#xff0c;但也有一些插件安装会比较难。比如我在安装SadTalker时&#xff0c;就遇到很多问题&#xff0c;一度放弃了&#xff0c;后来查了一些网上攻略&#xff0c;自己也反复查看日志&#xff0c;终于解决&#xff0c;不吐不快。 一、在Stable …

15分钟学 Python :编程工具 Idea 和 vscode 中配置 Python ( 补充 )

编程工具配置 Python 在 IDE 和 VSCode 中 在编程学习的过程中&#xff0c;选择合适的开发工具至关重要。本文将详细介绍在两种流行的IDE&#xff08;IntelliJ IDEA 和 Visual Studio Code&#xff09;中如何配置Python环境&#xff0c;帮助你更高效地进行Python开发。 一、编…

基于SSM的出租车租赁管理系统的设计与实现

文未可获取一份本项目的java源码和数据库参考。 1 选题的背景 现代社会&#xff0c;许多个人、家庭&#xff0c;因为生活、工作方式的改变&#xff0c;对汽车不再希望长期拥有&#xff0c;取而代之的是希望汽车能“召之即…

开源且实用的C#/.NET编程技巧练习宝库(学习,工作,实践指南)

DotNet Exercises介绍 DotNetGuide专栏C#/.NET/.NET Core编程常用语法、算法、技巧、中间件、类库、工作业务实操练习集&#xff0c;配套详细的文章教程讲解&#xff0c;助你快速掌握C#/.NET/.NET Core中各种编程常用语法、算法、技巧、中间件、类库、工作业务实操等等。 GitH…

【Spring Boot 入门二】Spring Boot中的配置文件 - 掌控你的应用设置

一、引言 在上一篇文章中&#xff0c;我们开启了Spring Boot的入门之旅&#xff0c;成功构建了第一个Spring Boot应用。我们从环境搭建开始&#xff0c;详细介绍了JDK的安装以及IDE的选择与配置&#xff0c;然后利用Spring Initializr创建了项目&#xff0c;分析了项目结构&am…

黑马linux笔记(转载)

学习链接 视频链接&#xff1a;黑马程序员新版Linux零基础快速入门到精通 原文链接&#xff1a;黑马程序员新版Linux零基础快速入门到精通——学习笔记 黑马Linux笔记 文章目录 学习链接01初识Linux1.1、操作系统概述1.1.1、硬件和软件1.1.2、操作系统1.1.3、常见操作系统 1.…

SSM人才信息招聘系统-计算机毕业设计源码28084

摘要 本研究旨在基于Java和SSM框架设计并实现一个人才信息招聘系统&#xff0c;旨在提升招聘流程的效率和精准度。通过深入研究Java和SSM框架在Web应用开发中的应用&#xff0c;结合人才招聘领域的需求&#xff0c;构建了一个功能完善、稳定高效的招聘系统。利用SSM框架的优势&…

数据订阅与消费中间件Canal 服务搭建(docker)

MySQL Bin-log开启 进入mysql容器 docker exec -it mysql5.7 bash开启mysql的binlog cd /etc/mysql/mysql.conf.dvi mysqld.cnf #在文件末尾处添加如下配置&#xff08;如果没有这个文件就创建一个&#xff09; [mysqld] # 开启 binlog log-binmysql-bin #log-bin/var/lib/mys…

CSP-J模拟赛三补题报告

前言 挂了110pts( ⇑ \Uparrow ⇑ \hspace{14em} 有史以来最大傻逼 T1&#xff1a; 100 p t s \color{green}100pts 100pts T2: 100 p t s → 80 p t s \color{green}100pts\color{yellow}\rightarrow\color{red}80pts 100pts→80pts T3: 100 p t s → 10 p t s \color{gre…

k8s架构,从clusterIP到光电半导体,再从clusterIP到企业管理

clusterIP作为k8s中的服务&#xff0c; 也是其他三个服务的基础 ~]$ kubectl create service clusterip externalname loadbalancer nodeport 客户端的流量到service service分发给pod&#xff0c;pod由控制器自动部署&#xff0c;自动维护 那么问题是service的可用…

【C++前缀和】1895. 最大的幻方|1781

本文涉及的基础知识点 C算法&#xff1a;前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 LeetCode1895. 最大的幻方 难度分&#xff1a;1781 一个 k x k 的 幻方 指的是一个 k x k 填满整数的方格阵&#xff0c;且每一行、每一列以及两条对角线的和 全部相…

ubuntu 设置静态IP

一、 ip addresssudo nano /etc/netplan/50-cloud-init.yaml 修改前&#xff1a; 修改后&#xff1a; # This file is generated from information provided by the datasource. Changes # to it will not persist across an instance reboot. To disable cloud-inits # ne…

360浏览器时不时打不开csdn

从百度或者csdn的搜索中打开&#xff0c;会发现打不开网页&#xff0c;以前也出现过&#xff0c;只是以为这篇文章被删了&#xff0c;昨天接连多个文章打不开&#xff0c;怀疑的浏览器的问题&#xff0c;复制网址到edge浏览器就打开了 刚刚又出现了&#xff0c;怀疑360会拦截某…

Elasticsearch——数据聚合、数据同步与集群搭建

目录 1.数据聚合1.1.聚合的种类1.2.DSL实现聚合1.2.1.Bucket 聚合语法1.2.2.聚合结果排序1.2.3.限定聚合范围1.2.4.Metric 聚合语法1.2.5.小结 1.3.RestAPI 实现聚合1.3.1.API 语法1.3.2.业务需求1.3.3.业务实现 2.自动补全2.1.拼音分词器2.2.自定义分词器2.3.自动补全查询2.4.…

使用百度文心智能体创建多风格表情包设计助手

文章目录 一、智能定制&#xff0c;个性飞扬二、多元风格&#xff0c;创意无限 百度文心智能体平台为你开启。百度文心智能体平台&#xff0c;创建属于自己的智能体应用。百度文心智能体平台是百度旗下的智能AI平台&#xff0c;集成了先进的自然语言处理技术和人工智能技术&…

C++ STL 初探:打开标准模板库的大门

文章目录 C STL 初探&#xff1a;打开标准模板库的大门前言第一章: 什么是STL&#xff1f;1.1 标准模板库简介1.2 STL的历史背景1.3 STL的组成 第二章: STL的版本与演进2.1 不同的STL版本2.2 STL的影响与重要性 第三章: 为什么学习 STL&#xff1f;3.1 从手动编写到标准化解决方…

C++网络编程之TCP协议

概述 TCP&#xff0c;即传输控制协议&#xff0c;英文全称为Transmission Control Protocol&#xff0c;是互联网协议套件中的核心协议之一。它工作在OSI七层模型的传输层&#xff0c;也工作在TCP/IP四层模型的传输层。TCP协议的主要目的是&#xff1a;在不可靠的网络环境中提供…