首页 > 编程语言 >Java中的序列化和反序列化是什么

Java中的序列化和反序列化是什么

时间:2024-11-07 09:58:58浏览次数:3  
标签:Java 字节 对象 什么 接口 序列化 serialVersionUID

序列化

是将对象转换为字节流的过程,这样对象可以通过网络传输、持久化存储或者缓存。Java提供了java.io.Serializable接口来支持序列化,只要类实现这个接口,就可以将该类的对象进行序列化。

反序列化

是将字节流重新转换为对象的过程,即从存储中读取数据并重新创建对象。

其他

  • 应用场景:包括网络传输、远程调用、持久化存储(如保存到文件或数据库)、以及分布式系统中数据交换。
  • Java序列化关键类和接口:ObjectOutputStream用于序列化,ObjectInputStream用于反序列化。类必须实现Serializable接口才能被序列化。
  • transient关键字:在序列化过程中,有些字段不需要被序列化,例如敏感数据,可以使用transient关键字标记不需要序列化的字段。
  • serialVersionUID:每个Serialozable类都应该定义一个serialVersionUID,用于在反序列化时验证版本一致性。如果没有明确指定,Java会根据类的定义自动生成一个UID,版本不匹配可能导致反序列化失败。
  • 序列化性能问题:Java的默认序列化机制可能比较慢,尤其是对于大规模分布式系统,可能会选择更加高效的序列化框架(如Protobuf、Kryo)。
  • 安全性:反序列化是一个潜在的安全风险,因为通过恶意构造的字节流,可能会加载不安全的类或执行不期望的代码。因此,反序列化过程需要进行输入验证,避免反序列化漏洞。

扩展知识

序列化与反序列化理解

序列化其实就是将对象转化为可传输的字节序列格式,以便于存储和传输。

因为对象在JVM中可以认为是“立体”的,会有各种引用,比如在内存地址Ox1234引用了某某对象,那此时这个对象要传输到网络的另一端时候就需要吧这些引用“压扁”。

因为网络的另一端的内存地址Ox1234可以没有某某对象,所以传输的对象需要包含这些信息,然后接收端将这些扁平的信息再反序列化得到对象。

所以,反序列化就是将字节序列格式转换为对象的过程。

Java序列化Serializable的意义

首先说一下Serializable,这个接口没有什么实际的含义,就是起标记作用。

来看一下源码就很清楚了,除了String、数组和枚举之外,如果实现了这个接口就走writeOrdinaryObject,否则就序列化就抛错。

 

serialVersionUID又有什么用?

private static final long serialVersionUID = 1L;

想必经常会看到这样的代码,这个ID其实就是用来验证序列化的对象和反序列化对应的对象的ID是否是一致的。

所以这个ID的数字其实不重要,无论是1L还是idea自动生成的,只要序列化的时候对象的serialVersionUID和反序列化的时候的对象的serialVersionUID一致的话就行。

如果没有显式指定serialVersionUID,则编译器会根据类的相关信息自动生成一个,可以认为是一个指纹。

所以如果你没有定义一个serialVersionUID然后序列化一个对象之后,在反序列化之前把对象的类的结构改了,比如增加了一个成员变量,则此时反序列化会失败。

因为类的结构变了,生成的指纹就变了,所以serialVersionUID就不一致了。

所以serialVersionUID就是起验证作用。

标签:Java,字节,对象,什么,接口,序列化,serialVersionUID
From: https://www.cnblogs.com/qimoxuan/p/18529613

相关文章

  • JavaScript中的this到底是什么?
    写在前面在JavaScript中,this关键字是一个非常重要的概念,它指向当前执行上下文中的对象。理解this的工作原理对于编写高效、可维护的JavaScript代码至关重要。本文将深入探讨this关键字的用法和规则。什么是this?this是一个特殊的关键字,在不同的上下文中可以指向不同的对象......
  • JavaScript中的变量作用域
    写在前面在JavaScript中,变量作用域是指变量在代码中可见的范围。理解变量作用域对于编写高效、可维护的JavaScript代码至关重要。本文将深入探讨JavaScript中的变量作用域,包括全局作用域、函数作用域和块级作用域。全局作用域在JavaScript中,任何在函数或块之外声明的变量......
  • 从 vue 源码看问题 — vue 中的 render helper 是什么?
    前言前面的文章中提到组件更新时,需要先执行编译器生成的渲染函数得到组件的vnode,而渲染函数生成vnode则是通过其中的_c、_l、、_v、_s等方法实现的.比如:普通节点被编译成了可执行_c函数v-for节点被编译成了可执行的_l函数…那么下面就一起来了解一下,什么......
  • 为什么前端打包出来的静态文件名字是一串 Hash 值 ?
    前端打包出来的静态文件名带有一串Hash值,主要是为了实现以下几个目的:缓存有效性:当文件内容发生变化时,Hash值也随之改变,这意味着浏览器能够识别文件的更新。如果文件内容没有变化,Hash值保持不变,浏览器可以从缓存中加载文件,节省网络带宽和提高加载速度。避免缓存问题:在......
  • PCB这么多层,都是什么意思?
    一、TOPLAYER(顶层布线层)此层被设计用于顶层铜箔走线,若为单面板则不存在该层。二、BOTTOMLAYER(底层布线层)作为底层铜箔走线的设计层。三、TOP/BOTTOMSOLDER(顶层/底层阻焊绿油层)在这一层,顶层和底层会敷设阻焊绿油,其作用是防止铜箔上锡,以保持绝缘状态。在焊盘、过孔......
  • 服务器上mysqld,java的进程Out of Memory,被kernel kill 掉了
    /var/log/messages里面日志如下Aug1019:47:16VM-0-7-centoskernel:8936totalpagecachepagesAug1019:47:16VM-0-7-centoskernel:0pagesinswapcacheAug1019:47:16VM-0-7-centoskernel:Swapcachestats:add0,delete0,find0/0Aug1019:47:16VM-0......
  • Kafka在后端开发中的应用场景是什么?
    Kafka在后端开发中的应用场景非常广泛,主要体现在以下几个方面:异步处理:Kafka可以用于异步处理消息,使得各个模块之间的处理流程可以独立进行,不需要等待前一个流程完成即可开始下一个流程。消息系统(Messaging) :Kafka可以替代传统的消息代理,用于解耦生产者和消费者之间的关系,缓......
  • 基于springboot框架在线生鲜商城推荐系统 java实现个性化生鲜/农产品购物商城推荐网站
    基于springboot框架在线生鲜商城推荐系统java实现个性化生鲜/农产品购物商城推荐网站爬虫、数据分析、排行榜基于协同过滤算法推荐、基于流行度热点推荐、平均加权混合推荐机器学习、大数据、深度学习OnlineShopRecommendEx一、项目简介1、开发工具和使用技术IDEA,jdk......
  • Java 8新特性深度解析:提升效率与功能
    Java8是Java语言发展史上的一个里程碑,它在2014年3月18日正式发布。Java8的发布引入了一系列创新的功能和改进,极大地提升了Java语言的表达能力、灵活性和性能。Java8的里程碑意义Java8标志着Java语言向函数式编程范式迈出了重要的一步。它不仅提高了开发人员的编码效率......
  • javascript 替代try catch方案详细完整案例和优缺点
    1.OptionalChaining(可选链)案例:constuser={name:"Kimi",details:{age:30}};constage=user.details?.age;//如果user或details是null/undefined,返回undefined而不是抛出错误优点:预防运行时错误,特别是在访问可能为null或undefined的对象......