Java高频面试之SE-19

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

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

序列化(Serialization)

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

关键点

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

示例

  • Java中通过实现 Serializable 接口:
    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反序列化:
    try (ObjectInputStream in = new ObjectInputStream(new FileInputStream("user.dat"))) {
        User user = (User) in.readObject();
    }
    
  • JSON反序列化:
    // 使用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原生 二进制 仅Java Java 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

你可能感兴趣的:(java,面试,开发语言)