什么是序列化与反序列化-常见Q&A

在这里插入图片描述

[Q&A] 什么是序列化与反序列化?

序列化:Java对象转换成字节序列,然后通过InputStreamOutputStream将内存中的类持久化到硬盘或者网络中传输
反序列化:字节序列恢复为Java对象的过程。

[Q&A] JSON字符串 和 字节序列 区别
都是表示数据的方式
JSON字符串:文本格式,人类可读,适合网络传输配置文件
字节序列:二进制格式,紧凑高效,适合网络传输文件存储


[Q&A] 为什么要序列化与反序列化?

对象、文件、数据,有许多不同的格式,很难统一传输和保存。序列化以后就都是 字节流了,无论原来是什么东西,都能变成一样的东西,就可以进行通用的格式传输或保存,传输结束以后,要再次使用,就进行反序列化还原,这样对象还是对象,文件还是文件。


[Q&A] 序列化应用场景

  1. 将内存中的类持久化到文件数据库
  2. 网络传输
  3. 对象序列化可以实现分布式对象
    RMI (Remote Method Invocation,远程调用) 要利用对象序列化运行远程主机上的服务,就像在本地机上运行对象时一样。
    RPC(Remote Procedure Call,远程过程调用)

[Q&A] RMI 和 RPC 区别
RMI:允许一个 Java 对象调用另一个位于不同 JVM 上的对象的方法。仅支持Java,仅在 JVM 之间工作。
RPC:允许一个程序调用另一个位于不同计算机上的子程序或过程,就像调用本地子程一样。支持多种编程语言,如 C/C++、Python、Go 等。


[Q&A] 序列化特点

  1. 递归保存:java对象序列化不仅保留一个对象的数据,而且递归保存对象引用的每个对象的数据。

[Q&A] 哪些类可以序列化?

  1. 数组
  2. 枚举
  3. 实现Serializable接口或Externalizable接口
    Serializable 和 Externalizable区别?

[Q&A] 什么是serialVersionUID

什么是serialVersionUID?


[Q&A] 如何禁止某个字段的持久化

如何禁止某个字段的持久化


[Q&A] Java中常用的序列化框架

  1. java原生:java.io.Serializable
  2. gson:谷歌开源
<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.8.9</version>
</dependency>
  1. fastjson:阿里巴巴开源
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.78</version>
</dependency>
  1. jackson:Tatu Saloranta 创建的。Tatu Saloranta 是一位经验丰富的软件工程师
  <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.13.0</version>
  </dependency>

[Q&A] java原生序列化和反序列化执行路径

  1. writeObject
  2. writeObject0:判断类是否为自定义类
  3. writeOrdinaryObject:区分SerializableExternalizable
  4. writeSerialData:序列化fields
  5. invokeWriteObject:反射调用类自己的序列化策略
    如果被序列化的类中定义了 writeObjectreadObject 方法,虚拟机会试图调用对象类里的 writeObjectreadObject 方法,进行用户自定义的序列化和反序列化。
    如果被序列化的类没有定义这2个方法,则默认调用是 ObjectOutputStream.defaultWriteObjectObjectInputStream.defaultReadObject 方法来执行序列化和反序列化。
ArrayList<String> list = new ArrayList<>();
list.add("Alice");
list.add("Bob");
list.add("Charlie");

# 序列化
try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("list.ser"))) {
    oos.writeObject(list);
} catch (Exception e) {
    e.printStackTrace();
}

[Q&A] ArrayList的序列化是怎么实现的?

ArrayList的序列化是怎么实现的?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值