📜  Java序列化中Serializable和Externalizable的区别(1)

📅  最后修改于: 2023-12-03 15:02:04.600000             🧑  作者: Mango

Java序列化中Serializable和Externalizable的区别

Java序列化是将对象转换成字节数组,以便在网络上传输或者存储在文件中。在Java中,有两种序列化接口,分别为Serializable和Externalizable,本文将介绍它们的区别。

Serializable接口

Serializable接口是Java提供的默认序列化接口,实现该接口的类可以在网络间传输,或者在不同JVM之间传输。实现该接口的类可以被JVM自动序列化和反序列化。需要注意的是,实现Serializable接口的类的所有成员变量(包括私有的成员变量)都会被序列化和反序列化。

示例代码
import java.io.Serializable;

public class User implements Serializable{
    private String name;
    private int age;

    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }
}

以上示例代码中,User类实现了Serializable接口。

Externalizable接口

Externalizable接口也是Java提供的序列化接口,不同于Serializable接口的是,需要手动实现序列化和反序列化方法。实现该接口的类需要手动实现writeExternal和readExternal方法,来指定哪些成员变量需要被序列化和反序列化。相对于Serializable来说,Externalizable在一些性能要求较高的场景下,可以编写更加高效的序列化和反序列化代码。

示例代码
import java.io.Externalizable;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;

public class User implements Externalizable {
    private String name;
    private int age;

    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }

  // 无参构造器必须提供,Externalizable反序列化时需要使用
    public User() {}
    
    @Override
    public void writeExternal(ObjectOutput out) throws IOException {
       // 自定义序列化代码
       out.writeObject(name);
       out.writeInt(age);
    }

    @Override
    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
        // 自定义反序列化代码
        this.name=(String) in.readObject();
        this.age=in.readInt();
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }
}

以上示例代码中,User类实现了Externalizable接口,并手动实现了writeExternal和readExternal方法。

总结

Serializable接口和Externalizable接口都是Java提供的序列化接口,二者有如下区别:

  1. Serializable接口默认序列化所有成员变量,Externalizable接口需要手动实现序列化和反序列化方法,从而决定哪些成员变量进行序列化和反序列化。

  2. Serializable接口提供了默认实现,实现该接口的类可以在不编写序列化和反序列化方法的情况下执行序列化和反序列化操作。Externalizable没有默认实现,需要手动实现序列化和反序列化方法。

  3. 在一些性能要求较高的场景下,Externalizable可以编写更加高效的序列化和反序列化代码。