美文网首页
序列化与反序列化:Externalizable

序列化与反序列化:Externalizable

作者: 夜阑w | 来源:发表于2019-02-26 12:16 被阅读0次

一、Externalizable简介

Externalizable接口继承了Serializable接口,用来在序列化时手动的把需要的对象信息进行序列化。Externalizable接口提供了两个方法:writeExternal(ObjectOuput out) 和 readExternal(ObjectInput in) 。在需要被序列化的类中实现这两个方法,这样在此类序列化时这两个方法将被自动执行,用以可定制地序列化此类。

一个例子

import java.io.*;
public class Country implements Externalizable {
    private static final long serialVersionUID = 1L;

    private String name;
    private int code;

    public String getName() {
        return this.name;
    }

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

    public int getCode() {
        return this.code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    @Override
    public void writeExternal(ObjectOutput out) throws IOException {
        out.writeUTF(name);
        out.writeInt(code);
    }

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

import java.io.*;
public class Text {
    public static void main(String[] args) throws Exception {
        Country c = new Country();
        c.setCode(374);
        c.setName("Armenia");

        FileOutputStream fileOutputStream
                = new FileOutputStream(new File("./Country.txt"));
        ObjectOutputStream objectOutputStream
                = new ObjectOutputStream(fileOutputStream);
        c.writeExternal(objectOutputStream);

        objectOutputStream.flush();
        objectOutputStream.close();
        fileOutputStream.close();

        FileInputStream fileInputStream
                = new FileInputStream(new File("./Country.txt"));
        ObjectInputStream objectInputStream
                = new ObjectInputStream(fileInputStream);

        Country c2 = new Country();
        c2.readExternal(objectInputStream);

        objectInputStream.close();
        fileInputStream.close();

        System.out.println(c2.getCode());  //374
        System.out.println(c2.getName());  //Armenia
        System.out.println(c2.getCode() == c.getCode());  //true
        System.out.println(c2.getName().equals(c.getName())); //true
    }
}

二、Externalizable与Serializable的区别

  • 关键区别是如何处理序列化过程。当类实现Serializable接口时,JVM完全负责类实例的序列化。在Externalizable的情况下,程序员应该负责整个序列化和反序列化过程。
  • 如果需要序列化整个对象,那么Serializable接口更适合。对于自定义序列化,可以使用Externalizable来对过程进行控制。
  • 通过使用transient关键字标记字段,可以使用Serializable接口实现自定义序列化。JVM不会序列化特定字段,但它会将字段添加到具有默认值的文件存储。
  • 使用Externalizable时,必须按照写入时的确切顺序读取所有字段状态。否则会出现异常,而Serializable接口没有这个要求。

相关文章

网友评论

      本文标题:序列化与反序列化:Externalizable

      本文链接:https://www.haomeiwen.com/subject/ifhayqtx.html