序列化与反序列化:Externalizable

2019-02-26  本文已影响0人  夜阑w

一、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的区别

上一篇 下一篇

猜你喜欢

热点阅读