码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Java面试题-Java核心基础-第十三天(序列化)


    目录

    一、Java序列化与反序列化是什么?

    二、为什么需要序列化与反序列化?

    三、序列化的实现方式有哪些?

    四、什么是serialVersionUID?

    五、为什么还要显示指定serialVersionUID

    六、serialVersionUID什么时候修改?

    七、Java序列化如果有些字段不想序列化,怎么办?

    八、静态变量会序列化吗?


    一、Java序列化与反序列化是什么?

    Java序列化就是将对象转为字节序列

    Java反序列化就是将字节序列转为内存中的对象

    二、为什么需要序列化与反序列化?

    其实大的来说就是为了保存对象的信息 状态信息 因为JVM一旦关闭 其对象也会被销毁 如何持久化对象就需要使用到序列化机制

    另外就是为了便于网络传输传输信息,传输字节序列给对方,对方接收到再进行反序列化就能获取到对象信息,像RPC或者是OpenFeign远程调用就是将对象进行序列化与反序列化的过程(其实就是实现分布式对象,多个服务可以使用同一对象)

    除此之外,序列化与反序列化机制还能用于实现深拷贝,序列化不仅只序列化当前对象,其对象里面的里面也会递归的序列化

    三、序列化的实现方式有哪些?

    类实现Serializable接口 或者是实现Externalizable接口

    实现Serializable接口的方式很简单,只需要实现这个接口,不需要实现里面的任何方法,因为里面就没方法,然后在类里面指定一个serialVersionUID就行 注意这个必须是static final long的

    而实现Externalizable接口的方式,就更加的灵活了,可以指定我们需要序列化的字段,而如何指定呢?就通过实现Externalizable接口接口中的readExternal和writeExternal方法就可以了

    例子:

    1. public class User implements Externalizable {
    2. private String name;
    3. private int age;
    4. public String getName() {
    5. return name;
    6. }
    7. public void setName(String name) {
    8. this.name = name;
    9. }
    10. public void writeExternal(ObjectOutput out) throws IOException {
    11. out.writeObject(name);
    12. }
    13. public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
    14. name = (String) in.readObject();
    15. }
    16. @Override
    17. public String toString() {
    18. return "User{" +
    19. "name='" + name +
    20. '}';
    21. }
    22. }

    两者的对比:

    Serializable接口更为简单,它是按照系统默认的序列化规则,能序列化所有属性。但是效率不高

    Externalizable接口需要自己重写两个方法,可以指定序列化字段,如果不重写的话,默认是属性类型的默认值 效率高

    四、什么是serialVersionUID?

    就是一个类的标识,需要依靠这个来反序列化。它的过程是:拿到序列化中的serialVersionUID值,然后与本地的类的serialVersionUID作比较,如果相同则反序列化成本地类对象,如果不同则序列化失败

    五、为什么还要显示指定serialVersionUID

    如果不显示指定,那么这个值就会根据类的属性来自动生成有一个serialVersionUID值,因此如果类中属性变化了,这个值就会发生变化。

    如果再我们序列化之后修改了类中的属性,那么此时这个serialVersionUID值就会与它原先当初序列化时类中的serialVersionUID不一样,所以就会反序列化失败。

    因此一般我们要手动的指定一个serialVersionUID值

    六、serialVersionUID什么时候修改?

    一般的时候不要修改,除非软件不兼容的情况 因为不兼容 所以不允许类随意发生改变

    七、Java序列化如果有些字段不想序列化,怎么办?

    使用transient修饰  或者类实现Externalizable接口的方式重写方法指定

    八、静态变量会序列化吗?

    不会,因为静态变量属于类,而序列化的是对象的信息。

    至于为什么静态的serialVersionUID可以被序列化 是因为JVM作了特殊判断,因为需要依靠它来进行反序列化

  • 相关阅读:
    带你畅游 Kubernetes 调度器
    网站登录界面制作(three.js 3D特效背景)+ boostrap导航栏实现 + jQuery移动窗口【附加源代码】
    回溯算法的基本思想
    工信部—高级软件开发工程师认证
    自从测试部新来了个00后卷王,老油条感叹真干不过,但是...
    掌握SKILL语言:数字IC设计师必备的技能之一
    抽象轻松的java——mybaties
    jsonp是什么?原理是什么?
    Go的并发
    PDF控件Spire.PDF for .NET【安全】演示:从加密的 PDF 文档中删除密码
  • 原文地址:https://blog.csdn.net/m0_63445035/article/details/134025640
  • 最新文章
  • 【JVM】编译执行与解释执行的区别是什么?JVM 使用哪种方式?
    用 Hashids 优雅解决 C 端自增 ID 暴露问题
    V8引擎 精品漫游指南--Ignition篇(上) 指令 栈帧 槽位 调用约定 内存布局 基础内容
    LLVM Pass快速入门(四):代码插桩
    milkup:桌面端 markdown AI续写和即时渲染
    基于项目工程构建SBOM(软件物料清单)的研究
    鸿蒙应用开发UI基础第二节:鸿蒙应用程序框架核心解析与实操
    .NET 中如何快速实现 List 集合去重?
    扣子Coze实战:从0到1打造抖音+小红书热点监控智能体
    浅谈数据访问层
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号