Java中的序列化和反序列化?

博主介绍:✌全网粉丝50W+,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌

技术范围:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、机器学习等设计与开发。

主要内容:免费功能设计、开题报告、任务书、中期检查、系统功能实现、代码编写、论文编写和辅导、论文降重、长期答辩答疑辅导、理解代码逻辑思路。

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

**序列化(Serialization)**是指将对象的状态信息转换为可以存储或传输的形式的过程。通常,这个过程会将对象转换成字节流,这样对象就可以被写入文件、发送到网络等。

**反序列化(Deserialization)**则是序列化的逆过程,它将字节流重新构造回对象。简而言之,就是把存储或传输的字节流转换回原来的对象状态。

为什么需要序列化和反序列化?
  1. 对象持久化:将对象保存到文件中,以便以后读取和恢复。
  2. 远程通信:在网络传输中,对象需要被序列化为字节流,才能在客户端和服务器之间传输。
  3. 对象克隆:通过序列化和反序列化,可以实现对象的深拷贝。
Java中的序列化实现

在Java中,序列化和反序列化是通过实现java.io.Serializable接口来完成的。这个接口是一个标记接口,没有定义任何方法,但它告诉JVM这个类的对象可以被序列化。

示例代码

下面是一个简单的例子,演示如何进行序列化和反序列化。

复制代码
import java.io.*;  
  
class Person implements Serializable {  
    private static final long serialVersionUID = 1L; // 推荐定义这个UID,确保序列化兼容性  
    private String name;  
    private int age;  
  
    // 构造函数、getter和setter方法  
    public Person(String name, int age) {  
        this.name = name;  
        this.age = age;  
    }  
  
    @Override  
    public String toString() {  
        return "Person{name='" + name + "', age=" + age + "}";  
    }  
}  
  
public class SerializationDemo {  
    public static void main(String[] args) {  
        Person person = new Person("Alice", 30);  
  
        // 序列化对象到文件  
        try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.ser"))) {  
            oos.writeObject(person);  
            System.out.println("对象已序列化到文件");  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
  
        // 从文件反序列化对象  
        try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.ser"))) {  
            Person deserializedPerson = (Person) ois.readObject();  
            System.out.println("从文件反序列化对象: " + deserializedPerson);  
        } catch (IOException | ClassNotFoundException e) {  
            e.printStackTrace();  
        }  
    }  
}
注意事项
  1. serialVersionUID :虽然它不是必须的,但推荐为每个可序列化的类定义一个serialVersionUID。这个UID用于版本控制,确保序列化和反序列化时的一致性。
  2. transient关键字 :如果某个字段不需要被序列化,可以使用transient关键字修饰。
  3. 安全性:序列化的数据可以被反序列化,这可能会带来安全风险。不要反序列化不信任的数据源。
  4. 性能:序列化和反序列化过程涉及I/O操作,可能会成为性能瓶颈。
进阶话题
  • 自定义序列化 :通过实现java.io.Externalizable接口,可以完全控制对象的序列化和反序列化过程。
  • 序列化代理 :Java 9引入了序列化代理机制,允许通过ObjectWriteReplacerObjectReadReplacer替换序列化对象。
相关推荐
程序员黑豆3 小时前
Java 注释详解:单行、多行与文档注释的完整指南
java·前端·ai编程
wuyk5554 小时前
第2章:六步换相原理全解+STM32工程实战
c语言·开发语言·stm32·单片机·嵌入式硬件
hey_sml4 小时前
JAVA每日一学---CompletableFuture中thenApply与thenCompose区别详解
java·开发语言
Doraemomo4 小时前
数据结构-环形链表
java·数据结构·链表
萧瑟余晖6 小时前
Java深入解析篇十七之SpringCloud
java·开发语言
是未才6 小时前
从输入 URL 到页面返回:DNS、路由、TLS 与 HTTP 完整链路
java·后端·计算机网络
ttod_qzstudio7 小时前
Java 常用语法极简通关(五):类与对象——字段、方法、构造器、this 与 static
java·开发语言·python
萧瑟余晖8 小时前
Java深入解析篇十七之Spring Security
java·开发语言·spring
不老刘9 小时前
【Java入门】Java服务部署方式全景对比:从java -jar到K8s
java·kubernetes·jar
离陌在学C#10 小时前
C# 重载与重写:深入理解面向对象编程的核心概念
java·c#