Java高频面试之SE-19

server/2025/2/11 19:05:00/

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.ppmy.cn/server/166835.html

相关文章

前端权限控制和管理

前端权限控制和管理 1.前言2.权限相关概念2.1权限的分类(1)后端权限(2)前端权限 2.2前端权限的意义 3.前端权限控制思路3.1菜单的权限控制3.2界面的权限控制3.3按钮的权限控制3.4接口的权限控制 4.实现步骤4.1菜单栏控制4.2界面的控制(1)路由导航守卫(2)动态路由 4.3按钮的控制…

CEF132 编译指南 MacOS 篇 - 基础开发工具安装实战 (二)

1. 引言 在 macOS 平台上编译 CEF132 之前,首要任务是搭建一个完善的开发环境。与 Windows 和 Linux 环境不同,macOS 的开发环境主要以 Xcode 为核心。本篇将作为 CEF132 编译指南系列的第二篇,详细指导读者如何在 macOS 系统上安装和配置 X…

DeepSeek图解10页PDF

以前一直在关注国内外的一些AI工具,包括文本型、图像类的一些AI实践,最近DeepSeek突然爆火,从互联网收集一些资料与大家一起分享学习。 本章节分享的文件为网上流传的DeepSeek图解10页PDF,免费附件链接给出。 1 本地 1 本地部…

LLM Note

PreNorm vs PostNorm Transformer Layer中有两处残连接,分别是网络输入 x \boldsymbol x x与SelfAttention层和MLP/FFN层的输出。 前标准化: 标准化在残连接add之前,即对SelfAttention/MLP层的输入进行标准化,将其输出再与输入相…

记录IMX6ULL开发板上移植SQLite3并运行Qt程序

文章目录 概要移植SQLite3Qt程序部署实验现象 概要 基于上一章对使用Qt运行对应的实验实例来完成对用户使用ui界面完成对SQLite数据库的增删改查等操作。本文旨在对上一句节的Qt程序部署到IMX6ULL开发板,并且完成对SQLite数据库在IMX6ULL开发板上的移植。 移植SQ…

docker配置国内源

在国内使用 Docker 时,由于默认的官方镜像源在访问速度上可能较慢,因此我们可以配置国内的镜像源来加快 Docker 镜像的下载速度。以下是配置国内 Docker 镜像源的步骤: 1. 修改 Docker 的配置文件 Docker 使用 /etc/docker/daemon.json 文件…

CNN-day6-经典神经网络AlexNet

day7-经典神经网络AlexNet ImageNet大规模视觉挑战赛(ILSVRC)被称为深度学习在图像分类任务研究方面进展的标杆。 AlexNet网络参加了ILSVRC2012年大赛获得冠军(超过第二名10%的性能),掀起了一波深度学习的浪潮,一个具有里程碑意…

微信小程序案例3——仿香哈菜谱微信小程序

文章目录 项目步骤第一部分 导航栏设计第一步:第三步:第四步第五步:第二部分:第1步:轮播图第2步 :宫格导航第3步:香哈头条初始化数据第4步:香哈头条列表渲染及绑定数据效果讲解1 swiper轮播图2 WXML 模板3 WXML引用import引用include引用4 WXML 列表渲染wx:for列表渲染…