序列化与反序列化

        总是能在实体类中看到这样的代码:

public class Paper implements Serializable {

    private static final long serialVersionUID=1L;

}

        然后好奇的点进Serializable接口,发现接口里什么都没写,头更大了,这干嘛呢?为什么只有实体类继承这个接口,又为什么要在下面加一个serialVersionUID呢?

        首先我们需要明白两个概念——序列化(ObjectOutputStream)与反序列化(ObjectInputStream)。

        序列化是将一个对象转换为一个字节序列,这个字节序列里包含了该对象的数据、有关对象类型的信息、有关存储在对象中数据的类型信息。而反序列化,就是将字节序列再转换为对象,读取其中的信息。根本的作用是为了将对象转换为可保持或传输的格式,便于存储和传输数据。当我们需要传输该对象,或将对象信息持久化时,都要将它序列化。

        既然这个Serializable这么重要,它又为什么会是空的呢?

        其实它是一个标识接口,就好像看到穿白大褂的人,我们会第一时间认为他是一名医生;穿格子衬衫的人,我们会认为他是一名程序员。Serializable接口就是为了告诉JVM,这是个需要序列化的对象,JVM看到这个标识就会开始工作。

        那么定义serialVersionUID的意义又是什么呢?

        serialVersionUID是用来辨别这个类的版本号的,如同软件版本更迭一般,1.0版本的软件和2.0版本的它自然是不相同的,它们之间存在差异以后,就无法正常反序列化——也就会报出InvalidCastException反序列化版本异常。

        在我们不指定这个版本号时,JVM会给我们自动生成一个,但默认的VersionUID会因为一些细节原因,产生反序列化异常。因此还是自己指定一个比较好。

        一般默认给它生成一个 1L,声明它目的就是为了避免反序列化时,因为一些细微变化导致的反序列化失败。序列化与反序列化一般用这样的代码来实现:

//序列化过程
ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream
                                                               (new File
                                                                (file)));
objectOutputStream.writeObject(myClass);


//反序列化过程
ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream
                                                               (new File
                                                                (file)));
myclass = (MyClass) objectInputStream.readObject();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值