首页 > 基础资料 博客日记

Java中的Externalizable序列化接口使用教程

2023-05-06 17:12:06基础资料围观526

在Java中,可序列化是指将对象转换成二进制流的过程,以便将其保存到文件系统或网络传输。一般情况下,Java中的序列化机制默认采用实现Serializable接口来实现序列化。但除了该接口外,Java还提供了另一种序列化接口:Externalizable。


Externalizable是Serializable的子接口,与Serializable不同的是,它要求程序员自行定义对象的序列化和反序列化方式,而不是采用默认的方式。在使用Externalizable接口实现序列化时,需要实现两个方法:writeExternal()和readExternal()。具体介绍如下:


1. 实现writeExternal()方法


void writeExternal(ObjectOutput out) throws IOException;


该方法用于指定对象的序列化规则。参数ObjectOutput表示一个输出流,通过此流可以将对象的字段输出,从而生成对象的序列化流。需要注意的是,在实现writeExternal()方法时,需要显示地调用OutputStream的writeXXX()方法按照属性顺序写出属性值,如:


public class User implements Externalizable {
    private String name;
    private int age;
    // 实现的writeExternal方法
    @Override
    public void writeExternal(ObjectOutput out) throws IOException {
        out.writeObject(name);
        out.writeInt(age);
    }
}


2. 实现readExternal()方法


void readExternal(ObjectInput in) throws IOException, ClassNotFoundException;


该方法用于指定对象的反序列化规则。参数ObjectInput表示一个输入流,通过此流可以读取对象的属性值,并根据这些属性值生成一个新对象。需要注意的是,在实现readExternal()方法时,需要自行调用InputStream的readXXX()方法获取属性值,例如:

public class User implements Externalizable {
    private String name;
    private int age;
    // 实现的readExternal方法
    @Override
    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
        this.name = (String) in.readObject();
        this.age = in.readInt();
    }
}


3. 使用Externalizable序列化对象


下面是一个使用Externalizable接口实现序列化和反序列化的示例代码:


public class User implements Externalizable {
    private String name;
    private int age;
    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }
    // 默认构造方法,反序列化时需要使用
    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 static void main(String[] args) throws Exception {
        String fileName = "user.bin";
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(fileName));
        User user = new User("Tom",20);
        objectOutputStream.writeObject(user);
        objectOutputStream.close();
        ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(fileName));
        User newUser = (User) objectInputStream.readObject();
        objectInputStream.close();
        System.out.println(newUser.name);
        System.out.println(newUser.age);
    }
}


在上述代码中,我们创建了一个User类并实现Externalizable接口,在writeExternal()和readExternal()方法中定义了对象的序列化和反序列化规则。在main()方法中,我们将User对象写入文件,并通过ObjectInputStream读取了该对象,再打印出了对象中的两个属性。


需要注意的是,使用Externalizable序列化时,必须提供一个无参构造函数,因为默认的Java反序列化机制是通过调用无参构造函数创建一个新的对象,然后再通过反射调用对象中的setter方法设置对象的属性值。


标签:

相关文章

本站推荐

标签云