Java 序列化与反序列化的原理

在Java中,序列化(Serialization)是将对象转换为字节流的过程,而反序列化(Deserialization)是将字节流转换回对象的过程。这种机制允许对象在网络上传输或在磁盘上持久化存储。

序列化的原理

标记接口

Java中的java.io.Serializable接口是一个标记接口,用于指示类的对象可以被序列化。只要类实现了这个接口,Java序列化系统就能够对该类的对象进行序列化。

标记接口是一个不包含任何方法或属性的接口,其作用主要是为了在运行时标记某个类是否具有特定的能力或特征。Java中的java.io.Serializable接口就是一个典型的标记接口。当一个类实现了Serializable接口时,它的对象就可以被序列化。

编译器检查

Java编译器在编译时会检查是否有Serializable接口的实现。如果一个类实现了Serializable接口,编译器会为该类加上一个标记,表明这个类的对象可以被序列化。

Java序列化系统

Java序列化系统在序列化对象时,会检查对象所属的类是否实现了Serializable接口。如果实现了这个接口,Java序列化系统会允许对该类的对象进行序列化;否则,会抛出NotSerializableException异常。

序列化方法

Serializable接口内部并没有定义任何方法,它仅仅是一个标记,告诉Java序列化系统该类可以被序列化。Java序列化系统会使用默认的序列化方法来序列化对象,这些方法会将对象的状态写入到输出流中,以便后续的反序列化。

对象的持久化

通过实现Serializable接口,对象的状态可以被持久化到磁盘或通过网络进行传输。在反序列化时,Java序列化系统会根据序列化时写入的字节流,重新构建对象,并将对象的状态恢复到序列化时的状态。

总之,java.io.Serializable接口作为一个标记接口,标志着一个类的对象可以被序列化。Java序列化系统在序列化和反序列化过程中会根据这个标记来确定是否允许对对象进行序列化和反序列化。

当一个类实现了Serializable接口,它的对象就可以被序列化。下面是一个简单的示例:

import java.io.*;

// 实现Serializable接口的类
class MyClass implements Serializable {
   
   
    private static final long serialVersionUID = 1L; // 序列化版本号
    private int id;
    private String name;

    // 构造方法
    public MyClass(int id, String name) {
   
   
        this.id = id;
        this.name = name;
    }

    // Getter和Setter方法
    public int getId() {
   
   
        return id;
    }

    public void setId(int id) {
   
   
        this.id = id;
    }

    public String getName() {
   
   
        return name;
    }

    public void setName(String name) {
   
   
        this.name = name;
    }
}

public class SerializationExample {
   
   
    public static void main(String[] args) {
   
   
        // 创建一个MyClass对象
        MyClass obj 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

海燕技术栈

你的鼓励我的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值