Java高频面试之SE-19

news/2025/2/8 21:14:04 标签: java, 面试, 开发语言

hello啊,各位观众姥爷们!!!本baby今天又来了!哈哈哈哈哈嗝🐶

什么是序列化?什么是反序列化?

序列化(Serialization)

定义
序列化是将对象的状态转换为可存储或可传输的格式(如字节流、JSON、XML等)的过程。其核心目的是将对象持久化到磁盘、数据库,或通过网络传输到其他系统。

关键点

  1. 对象 → 字节流:将内存中的对象转换为连续的字节序列。
  2. 跨平台/跨语言:序列化后的数据可以被其他系统(如不同编程语言、不同设备)读取。
  3. 用途
    • 网络传输(如RPC、HTTP请求)。
    • 持久化存储(如保存到文件、Redis、数据库)。
    • 分布式系统间数据交换。

示例

  • Java中通过实现 Serializable 接口:
    java">public class User implements Serializable {
        private String name;
        private int age;
        // getter/setter...
    }
    
  • 使用JSON序列化:
    {"name": "张三", "age": 25}
    

反序列化(Deserialization)

定义
反序列化是序列化的逆过程,将序列化后的数据(如字节流、JSON)重建为内存中的对象,恢复其原始状态。

关键点

  1. 字节流 → 对象:根据序列化规则,将数据还原为对象的实例。
  2. 校验与兼容性
    • 类的结构(如字段名、类型)需与序列化时兼容,否则可能失败。
    • 可通过版本号(如Java的 serialVersionUID)避免兼容性问题。
  3. 安全风险
    • 反序列化不可信数据可能导致漏洞(如Java反序列化攻击)。

示例

  • Java反序列化:
    java">try (ObjectInputStream in = new ObjectInputStream(new FileInputStream("user.dat"))) {
        User user = (User) in.readObject();
    }
    
  • JSON反序列化:
    java">// 使用Jackson库
    ObjectMapper mapper = new ObjectMapper();
    User user = mapper.readValue(jsonString, User.class);
    

序列化与反序列化的核心对比

特性序列化反序列化
方向对象 → 字节流/文本字节流/文本 → 对象
目的持久化、传输重建对象
依赖条件对象需支持序列化接口/协议目标类必须存在且结构兼容
常见格式二进制、JSON、XML、Protobuf同左

常见问题与注意事项

  1. 性能问题

    • 二进制序列化(如Java原生、Protobuf)效率高,但可读性差。
    • 文本序列化(如JSON、XML)可读性好,但体积大、解析慢。
  2. 版本兼容性

    • 修改类的字段或方法后,旧序列化数据可能无法反序列化。
    • 解决方案:
      • 使用版本号(serialVersionUID)。
      • 使用向后兼容的格式(如JSON忽略未知字段)。
  3. 安全问题

    • 反序列化恶意数据可能导致代码执行(如Java的 readObject 方法被攻击)。
    • 防范措施:
      • 避免反序列化不可信数据。
      • 使用白名单验证反序列化的类。
  4. 跨语言支持

    • 特定格式(如Java原生序列化)仅限Java生态。
    • 通用格式(如JSON、Protobuf)支持多语言。

主流序列化技术对比

技术格式性能跨语言可读性典型应用场景
Java原生二进制仅JavaJava RMI、缓存
JSON文本REST API、配置文件
XML文本旧系统、SOAP协议
Protobuf二进制极高微服务、高性能通信
Hessian二进制跨语言RPC(如Dubbo)
Avro二进制Hadoop、大数据存储

🤭

  • 序列化是对象持久化和传输的桥梁,反序列化是数据还原为对象的关键步骤。
  • 选择序列化技术需权衡性能、跨语言支持、可读性等因素。
  • 实际开发中,推荐优先使用通用性强、安全性高的格式(如JSON、Protobuf),避免过度依赖语言特定的序列化机制。

IDEA ji huo
https://pan.quark.cn/s/4216736c0427
最新🎬大全(唐探)
https://kdocs.cn/l/cqhxNU9I2lLD
deepSeek最全资料包
https://pan.quark.cn/s/2308ac09ed43

在这里插入图片描述


http://www.niftyadmin.cn/n/5845292.html

相关文章

【LeetCode】day15 142.环形链表II

142. 环形链表 II - 力扣(LeetCode) 题目描述 给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则…

还搞不透stm32单片机启动过程?一篇文章几百字让你彻底看懂!

1.stm32启动 1.1 msp和pc的初始值,第一步: 2.boot的值就被锁定了 可以根据实际绑定的值变动, 这里补充一点boot1和0的原理: 1.2来点刺激的: 这里我插入一个链接: 【明解STM32】一文搞明白STM32芯片存储…

2025年Android NDK超全版本下载地址

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列ChatGPT和AIGC 👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资源分…

备考蓝桥杯嵌入式4:使用LCD显示我们捕捉的PWM波

上一篇博客我们提到了定时器产生PWM波,现在,我们尝试的想要捕获我们的PWM波,测量它的频率,我们应该怎么做呢?答案还是回到我们的定时器上。 我们知道,定时器是一个高级的秒表(参考笔者的比喻&a…

【Linux网络编程】谈谈网络编程中的select、poll、epoll、Reactor、Proactor模型(下)

本文目录 一、IO多路复用第二版(epoll)二、epoll三大核心接口1、epoll_create()2、epoll_ctl()3、epoll_wait()4、epoll简单实例5、epoll的ET模式和LT模式6、epoll内核实现 三、异步IO四、Linux惊群效应与c10K问题五、主流网络模型介绍1、基于Thread-bas…

quartus24.1版本子模块因时钟问题无法综合通过,FPGA过OOC问题复盘

因为只负责一个子模块,所以需要单独对该子模块进行综合和过OOC,这时候已经有一些加虚拟pin文件,敲命令让子模块能过OOC的方法。但这个方法的前提是先过综合,然后再敲命令让虚拟管脚命令成功,最终可以过OOC。 今天负责…

【电商系统架构的深度剖析与技术选型】

以下是对电商系统架构的深度剖析与技术选型: 一、电商系统架构剖析 整体架构 前台系统:是用户直接交互的部分,包括用户界面、商品展示、购物车、订单结算等模块。需注重用户体验,确保页面设计美观、商品信息清晰、购物流程简便。…

荣耀内置的远程控制怎样用?荣耀如何远程控制其他品牌的手机?

荣耀手机没有内置的远程控制功能,倒是有一项内置的【远程守护】功能,可以共享定位。如果家里的老人、小孩都使用荣耀手机,那么可以共享定位,随时知道人在哪,避免走丢。 荣耀手机【远程守护】功能的使用步骤&#xff1a…