0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

实现序列化和反序列化为什么要实现Serializable接口

Android编程精选 来源:CSDN 作者:椰子Tyshawn 2022-07-12 11:05 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

做服务化,需要把所有model包里的类都实现Serializable接口, 同时还要显示指定serialVersionUID的值。听到这个需求,我脑海里就突然出现了好几个问题,比如说:

序列化和反序列化

序列化:把对象转换为字节序列的过程称为对象的序列化。

反序列化:把字节序列恢复为对象的过程称为对象的反序列化。

什么时候需要用到序列化和反序列化呢?

当我们只在本地JVM里运行下Java实例,这个时候是不需要什么序列化和反序列化的, 但当我们需要将内存中的对象持久化到磁盘, 数据库中时,当我们需要与浏览器进行交互时, 当我们需要实现RPC时,这个时候就需要序列化和反序列化了。

前两个需要用到序列化和反序列化的场景,是不是让我们有一个很大的疑问? 我们在与浏览器交互时,还有将内存中的对象持久化到数据库中时,好像都没有去进行序列化和反序列化,因为我们都没有实现Serializable接口, 但一直正常运行。

下面先给出结论:

只要我们对内存中的对象进行持久化或网络传输, 这个时候都需要序列化和反序列化.

理由:

服务器与浏览器交互时真的没有用到Serializable接口吗? JSON格式实际上就是将一个对象转化为字符串, 所以服务器与浏览器交互时的数据格式其实是字符串, 我们来看来String类型的源码:

poYBAGLM5WaAeyVsAADlsXQGlkM013.jpg

String类型实现了Serializable接口,并显示指定serialVersionUID的值。

然后我们再来看对象持久化到数据库中时的情况,Mybatis数据库映射文件里的insert代码:

pYYBAGLM5X6AeU3SAABSix10Bbk078.jpg

实际上我们并不是将整个对象持久化到数据库中, 而是将对象中的属性持久化到数据库中, 而这些属性都是实现了Serializable接口的基本属性。

实现序列化和反序列化为什么要实现Serializable接口?

在Java中实现了Serializable接口后,JVM会在底层帮我们实现序列化和反序列化, 如果我们不实现Serializable接口, 那自己去写一套序列化和反序列化代码也行, 至于具体怎么写, Google一下你就知道了。

实现Serializable接口就算了, 为什么还要显示指定serialVersionUID的值?

如果不显示指定serialVersionUID,JVM在序列化时会根据属性自动生成一个serialVersionUID, 然后与属性一起序列化,再进行持久化或网络传输. 在反序列化时,JVM会再根据属性自动生成一个新版serialVersionUID,然后将这个新版serialVersionUID与序列化时生成的旧版serialVersionUID进行比较, 如果相同则反序列化成功, 否则报错.

如果显示指定了serialVersionUID, JVM在序列化和反序列化时仍然都会生成一个serialVersionUID, 但值为我们显示指定的值, 这样在反序列化时新旧版本的serialVersionUID就一致了。

在实际开发中, 不显示指定serialVersionUID的情况会导致什么问题? 如果我们的类写完后不再修改, 那当然不会有问题, 但这在实际开发中是不可能的,我们的类会不断迭代, 一旦类被修改了,那旧对象反序列化就会报错. 所以在实际开发中, 我们都会显示指定一个serialVersionUID, 值是多少无所谓, 只要不变就行。

写个实例测试下:

User类

不显示指定serialVersionUID.

poYBAGLM5bmATDjoAADE3tBVFuI262.jpg

poYBAGLM5cKARs6HAABKja56wSg415.jpg

测试类

先进行序列化, 再进行反序列化.

pYYBAGLM5fGADpVAAAGAgrSz_mw962.jpg

pYYBAGLM5fmAEUlsAAA8Wgz1H6o479.jpg

结果

先注释掉反序列化代码,执行序列化代码,然后User类新增一个属性sex。

pYYBAGLM5iWAZJxyAADVZJJr1Bw657.jpg

pYYBAGLM5i2ACbSAAACcP1Hf3Dg941.jpg

再注释掉序列化代码执行反序列化代码,最后结果如下:

序列化前的结果: User{name='tyshawn', age=18}Exception in thread "main" java.io.InvalidClassException: org.tyshawn.SerializeAndDeserialize.User; local class incompatible: stream classdesc serialVersionUID = 1035612825366363028, local class serialVersionUID = -1830850955895931978报错结果为序列化与反序列化产生的serialVersionUID不一致。

接下来我们在上面User类的基础上显示指定一个serialVersionUID。

poYBAGLM5lmALd2xAAAeVtahAXk183.jpg

再执行上述步骤, 测试结果如下:

poYBAGLM5miAFVtCAABGruQrwYg110.jpg

显示指定serialVersionUID后就解决了序列化与反序列化产生的serialVersionUID不一致的问题。

Java序列化的其他特性

先说结论, 被transient关键字修饰的属性不会被序列化, static属性也不会被序列化。

我们来测试下这个结论:

User类

poYBAGLM5qaADmAWAAEkCBKh5h4352.jpg

pYYBAGLM5q6AIREwAAETOQGRbiE266.jpg

测试类

pYYBAGLM5uKAUZX_AAGU7j52Bic863.jpg

poYBAGLM5uiAQ0aVAAA7LL1_O6Y789.jpg

结果

先注释掉反序列化代码, 执行序列化代码, 然后修改User类signature = “我的眼里只有你”, 再注释掉序列化代码执行反序列化代码, 最后结果如下:

poYBAGLM5v-ALZ49AAB0bxxmfIk875.jpg

static属性为什么不会被序列化?

因为序列化是针对对象而言的,而static属性优先于对象存在,随着类的加载而加载, 所以不会被序列化。

看到这个结论,是不是有人会问,serialVersionUID也被static修饰,为什么serialVersionUID会被序列化? 其实serialVersionUID属性并没有被序列化,JVM在序列化对象时会自动生成一个serialVersionUID,然后将我们显示指定的serialVersionUID属性值赋给自动生成的serialVersionUID。

审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 接口
    +关注

    关注

    33

    文章

    9451

    浏览量

    156181
  • JAVA
    +关注

    关注

    20

    文章

    2997

    浏览量

    115715
  • RPC
    RPC
    +关注

    关注

    0

    文章

    113

    浏览量

    12200

原文标题:Java 序列化和反序列化,为什么要实现 Serializable 接口?

文章出处:【微信号:AndroidPush,微信公众号:Android编程精选】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    探索ADS5271:8通道12位50MSPS模数转换器的卓越性能

    LVDS时钟用于数据序列化和传输过程,每个内部ADC的字输出被序列化,并可以选择先传输最高有效位(MSB)或最低有
    的头像 发表于 12-03 13:51 296次阅读
    探索ADS5271:8通道12位50MSPS模数转换器的卓越性能

    ATA-D60090功率放大器在时间调制序列生成中的应用

    利用计算机生成波束扫描所需的的波束扫描的时间编码序列。根据时间编码序列,任意信号发生器产生的方波信号通过功率放大器产生控制电压信号。
    的头像 发表于 11-30 14:27 292次阅读
    ATA-D60090功率放大器在时间调制<b class='flag-5'>序列</b>生成中的应用

    燃料电池EIS测试之负载方案 — 助力氢能产业蓬勃发展

    艾诺大功率直流电子负载AN23600E系列采用全新一代数字控制器,内置五大基本模式以及七大进阶模式,同时提供了序列化功能,满足使用者的编程、自动测试等多种需求。
    的头像 发表于 11-21 14:07 204次阅读
    燃料电池EIS测试之负载方案 — 助力氢能产业蓬勃发展

    实时销售数据采集接口技术实现方案

    ] → [缓冲层] → [处理层] → [存储层]   其中: $$ text{吞吐量} = frac{text{处理单元数} times text{单机处理能力}}{text{网络延迟} + text{序列化开销}} $$ 三、关
    的头像 发表于 10-23 16:01 317次阅读
    实时销售数据采集<b class='flag-5'>接口</b>技术<b class='flag-5'>实现</b>方案

    如何使用GPIO模拟ARGB2 LED定时序列,并在M258系列微控制器(MCU)上实现彩虹波ARGB2 LED效果?

    使用GPIO模拟ARGB2 LED定时序列,并在M258系列微控制器(MCU)上实现彩虹波ARGB2 LED效果
    发表于 08-20 06:55

    请问如何通过 ADV7180 将 CCTV(模拟)摄像机与EZ-USB™ FX3 连接?

    的ADV7180 (附有数据表 + 图片)进行反序列化,并输出与 8 位 ITU-R BT.656 接口标准兼容的 4:2:2 分量视频数据。 以下是我针对此背景提出的问题: 1. 我可以直接将此
    发表于 07-25 07:42

    TaskPool和Worker的对比分析

    TaskPoolWorker内存模型线程间隔离,内存不共享。线程间隔离,内存不共享。 参数传递机制采用标准的结构克隆算法(Structured Clone)进行序列化反序列化,完成参数传递。 支持ArrayBuffer
    发表于 06-18 06:43

    鸿蒙5开发宝藏案例分享---跨线程性能优化指南

    , bookList); // 卡在主线程序列化! 改造后 (<8ms): // 关键:实现Sendable接口! class Book implements Sendable
    发表于 06-12 17:13

    快手上线鸿蒙应用高性能解决方案:数据反序列化性能提升90%

    普通对象(如 JSON 数据)与类实例进行互转,是实现面向对象编程与数据序列化解耦的核心工具。随着业务复杂度的提升,该库在反序列化过程中逐渐暴露出性能瓶颈,影响用户核心体验。因此
    发表于 05-15 10:01

    快手上线鸿蒙应用高性能解决方案

    了其数据反序列化性能,在典型场景下能够降低约90%的数据转换耗时,为鸿蒙应用带来了更流畅的用户体验和更敏捷的交互响应。
    的头像 发表于 05-14 09:11 996次阅读
    快手上线鸿蒙应用高性能解决方案

    spartan 6 14位LVDS 反序列化

    spartan 6系列的FPGA 与14位ADC 输出LVDS信号 怎么实现1:14的串转并呢?iserdes2 在ise里面最高只能实现8位啊
    发表于 04-25 15:20

    什么是SerDes?SerDes有哪些应用?

    SerDes是一种功能块,用于对高速芯片间通信中使用的数字数据进行序列化反序列化。用于高性能计算(HPC)、人工智能(AI)、汽车、移动和物联网(IoT)应用的现代片上系统(SoC)都实现
    的头像 发表于 03-27 16:18 4883次阅读
    什么是SerDes?SerDes有哪些应用?

    用DLP4500设置序列是在Fireware Upload之前还是之后?

    用DLP4500 设置序列是在Fireware Upload之前还是之后? 是不是每一次加载.bin文件后重新设置一次序列
    发表于 02-27 07:40

    DS2411硅序列号技术手册

    DS2411硅序列号是可由外部供电的低成本、电子注册码芯片。它能用最少的电子接口(例如:微控制器的一个端口)提供绝对唯一的电子身份标识。DS2411的注册码是由工厂激光刻制的64位ROM码,其中包括
    的头像 发表于 02-26 17:16 973次阅读
    DS2411硅<b class='flag-5'>序列</b>号技术手册

    使用BP神经网络进行时间序列预测

    使用BP(Backpropagation)神经网络进行时间序列预测是一种常见且有效的方法。以下是一个基于BP神经网络进行时间序列预测的详细步骤和考虑因素: 一、数据准备 收集数据 : 收集用于训练
    的头像 发表于 02-12 16:44 1277次阅读