Externalizable的用法

  • 语法
class ClassName implements Externalizable {
    // other code
}

例子

import java.io.Externalizable;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;

public class Student implements Externalizable {
    private static final long serialVersionUID = 1l;
    private String name;
    private int age;

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
    @Override
    public void writeExternal(ObjectOutput out) throws IOException {
        out.writeUTF(name);
        out.writeInt(age);
    }

    @Override
    public void readExternal(ObjectInput in)
            throws IOException, ClassNotFoundException {
        this.name = in.readUTF();
        this.age = in.readInt();
    }

}

import java.io.*;

public class ExternalizableTest {
    public static void main(String[] args) throws IOException, ClassNotFoundException {

        Student student = new Student();
        student.setAge(27);
        student.setName("Tom");

        try (ObjectOutputStream outputFile = new ObjectOutputStream(new FileOutputStream(new File("./Student.txt")))) {
            outputFile.writeObject(student); // write person to file
        }

        // deserializable
        // read file
        Student studentDeserializable;
        try (ObjectInputStream inputFile = new ObjectInputStream(new FileInputStream(new File("./Student.txt")))) {
            studentDeserializable = (Student) inputFile.readObject();
        }
        System.out.println(studentDeserializable.getName());


    }
}

输出结果:

image.png

  • Externalizable和Serializable的区别

1、序列化责任
这里的关键区别是我们如何处理序列化过程。当类实现java.io.Serializable接口时,JVM完全负责序列化类实例。在Externalizable的情况下,程序员应该负责整个序列化和反序列化过程。

2、用例
如果我们需要序列化整个对象,那么Serializable接口更适合。另一方面,对于自定义序列化,我们可以使用Externalizable控制流程。

3、性能
java.io.Serializable接口使用反射和元数据,这会导致相对较慢的性能。相比之下,Externalizable接口使您可以完全控制序列化过程。

4、阅读顺序
使用Externalizable时,必须按照写入时的确切顺序读取所有字段状态。否则,我们会得到一个例外。
例如,如果我们更改Student类中的代码和name属性的读取顺序,则将抛出java.io.EOFException。同时,Serializable接口没有这个要求。

5、自定义序列化
我们可以通过使用transient关键字标记字段来使用Serializable接口实现自定义序列化。 JVM不会序列化特定字段,但它会将字段添加到具有默认值的文件存储。这就是为什么在自定义序列化的情况下使用Externalizable是一个好习惯。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • JAVA序列化机制的深入研究 对象序列化的最主要的用处就是在传递,和保存对象(object)的时候,保证对象的完整...
    时待吾阅读 11,202评论 0 24
  • Externalizable的用法 实现了Externalizable接口的类需要重写wirteExternal(...
    FoxLayla阅读 1,047评论 0 0
  • 官方文档理解 要使类的成员变量可以序列化和反序列化,必须实现Serializable接口。任何可序列化类的子类都是...
    狮_子歌歌阅读 2,555评论 1 3
  • Java性能问题一直困扰着广大程序员,由于平台复杂性,要定位问题,找出其根源确实很难。随着10多年Java平台的改...
    程序员技术圈阅读 4,959评论 0 65
  • 其实你早就非常熟悉了,这个词就是“满足”。 满足是一个非常重要的词,它也是你可以用来衡量很多东西的刻度: 其中就可...
    网领天下阅读 1,269评论 1 2

友情链接更多精彩内容