【面试题精讲】JDK 自带的序列化方式

简介: 【面试题精讲】JDK 自带的序列化方式

!! 有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准https://blog.zysicyj.top

首发博客地址[1]

面试题手册[2]

系列文章地址[3]


1. 什么是 JDK 自带的序列化方式?

JDK(Java Development Kit)提供了一种内置的序列化机制,即 Java 对象序列化。它允许将 Java 对象转换为字节流,以便在网络上传输或保存到磁盘上,并且可以通过反序列化将字节流重新转换回 Java 对象。

2. 为什么需要 JDK 自带的序列化方式?

JDK 自带的序列化方式具有以下几个优点:

  • 简单易用:使用 JDK 自带的序列化方式,只需实现 Serializable 接口并添加 serialVersionUID 字段即可。
  • 跨平台:由于序列化后的数据是以字节流形式存储的,因此可以在不同操作系统和编程语言之间进行传输和共享。
  • 对象图形完整性:JDK 自带的序列化方式会保留对象的完整结构,包括对象的属性、方法等信息。
  • 支持版本兼容性:当类的定义发生变化时,JDK 自带的序列化方式能够处理旧版本与新版本之间的兼容性问题。

3. JDK 自带的序列化方式的实现原理?

JDK 自带的序列化方式基于 Java 的反射机制和字节码技术来实现。当一个对象被序列化时,JVM 会根据对象的类型和结构将其转换为字节流。在反序列化时,JVM 会根据字节流中的信息重新构造出原始对象。

具体实现过程如下:

  • 序列化:当调用 ObjectOutputStreamwriteObject()方法时,JVM 会检查被序列化的对象是否实现了 Serializable 接口。如果没有实现,则抛出 NotSerializableException异常。如果实现了 Serializable 接口,则 JVM 会通过反射机制获取对象的类结构,并将其转换为字节流。
  • 反序列化:当调用 ObjectInputStreamreadObject()方法时,JVM 会读取字节流并还原成 Java 对象。在此过程中,JVM 会使用反射机制创建对象,并通过反射设置对象的属性值。

4. JDK 自带的序列化方式的使用示例

以下是一个简单的示例代码,演示了如何使用 JDK 自带的序列化方式:

import java.io.*;
public class SerializationExample {
    public static void main(String[] args) {
        // 创建一个Person对象
        Person person = new Person("John", 25);
        try {
            // 将Person对象序列化到文件中
            FileOutputStream fileOut = new FileOutputStream("person.ser");
            ObjectOutputStream out = new ObjectOutputStream(fileOut);
            out.writeObject(person);
            out.close();
            fileOut.close();
            // 从文件中反序列化Person对象
            FileInputStream fileIn = new FileInputStream("person.ser");
            ObjectInputStream in = new ObjectInputStream(fileIn);
            Person deserializedPerson = (Person) in.readObject();
            in.close();
            fileIn.close();
            // 打印反序列化后的Person对象
            System.out.println("Deserialized Person:");
            System.out.println("Name: " + deserializedPerson.getName());
            System.out.println("Age: " + deserializedPerson.getAge());
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}
class Person implements Serializable {
    private static final long serialVersionUID = 1L;
    private String name;
    private int age;
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public int getAge() {
        return age;
    }
}

5. JDK 自带的序列化方式的优点

  • 简单易用:只需实现 Serializable 接口即可进行序列化和反序列化操作。
  • 跨平台:可以在不同操作系统和编程语言之间传输和共享数据。
  • 对象图形完整性:保留了对象的完整结构,包括属性、方法等信息。
  • 版本兼容性:能够处理旧版本与新版本之间的兼容性问题。

6. JDK 自带的序列化方式的缺点

  • 序列化后的字节流较大:JDK 自带的序列化方式会将对象的所有属性都转换为字节流,导致序列化后的字节流较大,占用存储空间较多。
  • 可读性差:序列化后的字节流是二进制数据,不易阅读和理解。
  • 性能较低:JDK 自带的序列化方式在序列化和反序列化过程中需要进行大量的 IO 操作和对象创建操作,性能相对较低。

7. JDK 自带的序列化方式的使用注意事项

  • 序列化 ID(serialVersionUID)的一致性:为了保证序列化后的字节流与反序列化时的类定义一致,需要显式地指定一个序列化 ID。如果没有指定,则 JVM 会根据类的结构生成一个默认的序列化 ID,但当类的结构发生变化时,可能导致反序列化失败。
  • 非序列化字段的处理:如果一个类中包含非序列化字段,可以通过 transient关键字将其标记为瞬态字段,这样在序列化过程中会被忽略。
  • 版本兼容性:当类的定义发生变化时,需要考虑旧版本与新版本之间的兼容性问题。可以通过修改序列化 ID、添加 readObject()writeObject()方法等方式来实现版本兼容性。

8. 总结

JDK 自带的序列化方式提供了一种简单易用的 Java 对象序列化和反序列化机制。它具有跨平台、对象图形完整性和版本兼容性等优点,但也存在序列化后的字节流较大、可读性差和性能较低等缺点。在使用时需要注意序列化 ID 的一致性、非序列化字段的处理和版本兼容性等问题。

参考资料

[1]

首发博客地址: https://blog.zysicyj.top/

[2]

面试题手册: https://store.amazingmemo.com/chapterDetail/1685324709017001

[3]

系列文章地址: https://blog.zysicyj.top/categories/技术文章/后端技术/系列文章/面试题精讲/

本文由 mdnice 多平台发布

相关文章
|
5月前
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
8月前
|
Java 编译器 API
【面试问题】JDK 和 JRE 的区别?
【1月更文挑战第27天】【面试问题】JDK 和 JRE 的区别?
|
8月前
|
存储 缓存 并行计算
【面试问题】JDK并发类库提供的线程池实现有哪些?
【1月更文挑战第27天】【面试问题】JDK并发类库提供的线程池实现有哪些?
|
5月前
|
存储 安全 Java
JVM常见面试题(二):JVM是什么、由哪些部分组成、运行流程,JDK、JRE、JVM关系;程序计数器,堆,虚拟机栈,堆栈的区别是什么,方法区,直接内存
JVM常见面试题(二):JVM是什么、由哪些部分组成、运行流程是什么,JDK、JRE、JVM的联系与区别;什么是程序计数器,堆,虚拟机栈,栈内存溢出,堆栈的区别是什么,方法区,直接内存
JVM常见面试题(二):JVM是什么、由哪些部分组成、运行流程,JDK、JRE、JVM关系;程序计数器,堆,虚拟机栈,堆栈的区别是什么,方法区,直接内存
|
6月前
|
Java 编译器 程序员
JVM常见面试题(一):JVM是什么、由哪些部分组成、运行流程是什么,JDK、JRE、JVM的联系与区别
JVM常见面试题(一):JVM是什么、由哪些部分组成、运行流程是什么,JDK、JRE、JVM的联系与区别
JVM常见面试题(一):JVM是什么、由哪些部分组成、运行流程是什么,JDK、JRE、JVM的联系与区别
|
5月前
|
存储 Java
【Java集合类面试七】、 JDK7和JDK8中的HashMap有什么区别?
JDK7中的HashMap使用数组加链表解决冲突,而JDK8增加了红黑树结构以优化链表过长时的性能,提高查找效率。
|
5月前
|
XML 存储 JSON
【IO面试题 六】、 除了Java自带的序列化之外,你还了解哪些序列化工具?
除了Java自带的序列化,常见的序列化工具还包括JSON(如jackson、gson、fastjson)、Protobuf、Thrift和Avro,各具特点,适用于不同的应用场景和性能需求。
|
5月前
|
JSON Java 数据格式
【IO面试题 七】、 如果不用JSON工具,该如何实现对实体类的序列化?
除了JSON工具,实现实体类序列化可以采用Java原生序列化机制或第三方库如Protobuf、Thrift、Avro等。
|
5月前
|
Java
JDK序列化原理问题之Hessian框架不支持writeObject/readObject方法如何解决
JDK序列化原理问题之Hessian框架不支持writeObject/readObject方法如何解决
|
5月前
|
自然语言处理 JavaScript 前端开发
JDK序列化原理问题之FuryJDK序列化性能问题的如何解决
JDK序列化原理问题之FuryJDK序列化性能问题的如何解决