首页 > 基础资料 博客日记
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方法设置对象的属性值。
标签: