什么是序列化和反序列化
- 序列化:(将对象转换成字节流的形式)将java对象以一连串的字节保存在磁盘文件中的过程,也可以说是保存java对象状态的过程。序列化可以将数据永久保存在磁盘上(通常保存在文件中)。
- 反序列化:将保存在磁盘文件中的java字节码重新转换成java对象称为反序列化(将字节流转化成内存中的对象)
如何实现序列化和反序列化
序列化
首先,被序列化的类要实现 Serializable 接口,然后该类型的对象都可以被序列化了
//对象实例化
Person person1 = new Person("小花","女",18);
//将对象转换成字节流的格式输出出去
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person1"));
oos.writeObject(person1);
//关闭资源
oos.close();
当程序运行完之后,我们发现程序文件中多了一个person1的文件
打开后发现里面全是乱码,这是因为程序把person1对象序列化成字节保存下来了
我们可以通过反序列化去读取它
反序列化
ObjectInputStream ooi = new ObjectInputStream(new FileInputStream("person1"));
person pe = (person) ooi.readObject();
System.out.println(pe.getName());//person{name='小花', sex='女', age=18}
ooi.close();
不被序列化
那么,如果开发过程中,有一些属性不想被序列化出去我们怎么避免序列化呢,那些内容是不会被序列化出去的呢?
不能被序列化的内容有以下几个方面。
一、有static修饰的属性。
二、有transient修饰的属性。
三、成员方法。
还是以上边的person为例,我们将其name属性用transient修饰,结果当我们再运行程序的时候报异常了,这是为什么呢
serialVersionUID
这是因为JAVA序列化的机制是通过判断类的serialVersionUID来验证的版本一致的。在进行反序列化时,JVM会把传来的字节流中的serialVersionUID于本地相应实体类的serialVersionUID进行比较。如果相同说明是一致的,可以进行反序列化,否则会出现反序列化版本一致的异常,InvalidCastException。
因为随着文件的修改,它的serialVersionUID也会随之改变,这就是为什么刚刚可以,现在不可了,其实就是找不到家门了。
所有我们要在想要序列化的类中加入serialVersionUID 字段,防止其因为二次修改而反序列化异常
private static final long serialVersionUID = 1L;
我们加上以上代码后,成功的读出了name为null的person对象
person{name='null', sex='女', age=18}
优点
一、以某种存储形式使自定义对象持久化。
二、序列化对象信息完整,保证其完整性。
三、将对象从一个地方传递到另一个地方,可传递性。
四、使程序更具维护性。