一文带你认识java对象的序列化反序列化

1.序列化与反序列化

Java的对象序列化将那些实现了Serializable接口的对象转换成一个字节序列,并能够在以后将这个字节序列完全恢复为原来的对象。这一过程甚至可通过网络进行,这意味着序列化机制能自动弥补不同操作系统之间的差异。也就是说,可以在运行Windows系统的计算机上创建 一个对象,将其序列化,通过网络将它发送给一台运行Unix系统的计算机,然后在那里准确地重新组装,而却不必担心数据在不同机器上的表示会不同,也不必关心字节的顺序或者其他任何细节。

就其本身来说,对象的序列化是非常有趣的,因为利用它可以实现轻量级持久性 (lightweight persistence)。"持久性”意味若一个对象的生存周期井不取决千程序是否正在执行, 它可以生存千程序的调用之间。通过将一个序列化对象写人磁盘,然后在重新调用程序时恢复该对象,就能够实现持久性的效果。之所以称其为"轻址级”,是因为不能用某种“persistent"(持久)关键字来简单地定义一个对象,井让系统自动维护其他细节问题(尽管将来有可能实现)。相反,对象必须在程序中显式地序列化(serialize)和反序列化还原(deserialize)。

我们知道实现对象的序列化需要实现Serializeable接口,java中没有关键字定义对此做支持。该接口仅是一个标记接口,不包括任何方法。

在这里插入图片描述

要序列化一个对象,首先要创建某些OutputStream对象,然后将其封装在一个ObjectOutput­Stream对象内。这时,只需调用writeObjectO即可将对象序列化,并将其发送给OutputStream (对象化序列是基于字节的,因要使用lnputStream和OutputStream继承层次结构)。要进行反序列化(即将一个序列还原成一个对象),需要将一个lnputStream封装在ObjectlnputStream内, 然后调用readObject()。

对象序列化能将一个对象下的所有信息转为一个序列,包括对象下的所有引用。

接下来我们写个序列化于反序列化的实例:

class Worm implements Serializable {
    private Data[] data ={
            new Data(1),
            new Data(2),
            new Data(3)
    };

    private String name;
    private String age;

    @Override
    public String toString() {
        return "Worm{" +
                "data=" + Arrays.toString(data) +
                ", name='" + name + '\'' +
                ", age='" + age + '\'' +
                '}';
    }

    public static void main(String[] args) throws Exception{
        Worm worm = new Worm();
        worm.name = "jeep";
        worm.age = "18";
        ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("worm.txt"));
        //对象序列化
        out.writeObject(worm);
        out.close();

        ObjectInputStream in = new ObjectInputStream(new FileInputStream("worm.txt"));
        //反序列化
        Worm readWorm = (Worm)in.readObject();
        System.out.println("打印反序列化对象结果"+readWorm);
    }
}

class Data implements Serializable {
    private int n;
    public Data(int n){
        this.n = n;
    }

    @Override
    public String toString() {
        return "Data{" +
                "n=" + n +
                '}';
    }
}

output:

在这里插入图片描述

如果我们是将上面这个对象序列化之后通过网络发给另一台计算机,要想使用这个对象,必须保证其java虚拟机能够找到该对象的.class文件。

2.序列化的控制

如果我们不想使用让子对象序列化的话可以让子对象实现Externalizable接口而不是实现Serializable,Externalizable接口继承了Serializable接口,同时增添了两个方法,如下图:

在这里插入图片描述
另外如果我们不想对象中某个字段被序列化,我们可以将这个字段用transient 关键字修饰以来关闭其自动序列化。当然即使被transient 关键字修饰,我们也可以在对象中重写writeObject(),readObject()方法以达到序列化和反序列化的目的。

©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页