序列化和反序列化
java是一门面向对象的语言,在java中有一组功能强大的流类型:
对象流:
java.io.ObjectOutputStream
java.io.ObjectInputStream
对象流是一对高级流,可以读写java中任何对象
对象输出流负责在写出对象的过程中,将对象按照结果转换为一组字节(对象序列化)
对象输出流负责在读取对象的过程中将字节还原为对象(对象反序列化)
序列化目标Person类
序列化对象,需要使用对象流的void writeObject()方法
该方法在写出一个对象时有一个前提条件是要求对象所属的类必须实现序列化接口(Serializable),否则会抛出异常。
Person类
要序列化的Person类代码如下:
package com.tedu.io;
import java.io.Serializable;
import java.util.Arrays;
/**
* 用于测试对象流(序列化)内容的实体类
*
* 注:这个类必须要实现一个接口Serializable
* @author Wildmess
*
*/
public class Person implements Serializable{
/**
* serialVersionUID是表示当前Person类的版本
* 序列化时会将这个版本信息也写入到硬盘
* 反序列化时会对比版本的数值是否相同,相同可转,不相同不可转
*/
private static final long serialVersionUID = 1L;
private String name;
private int age;
//一个人可以有很多爱好
//可以通过transient关键字让某一个字段不进入序列化序列中
private transient String[] hobby;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String[] getHobby() {
return hobby;
}
public void setHobby(String[] hobby) {
this.hobby = hobby;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age +
"," + Arrays.toString(hobby) + "]";
}
}
序列化操作
序列化的代码如下:
package com.tedu.io;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
/**
* 对象流用于对象的序列化和反序列化
* java.io.ObjectOutputStream
* java.io.ObjectInputStream
*
* 对象流也是高级流
*
* @author Wildmess
*
*/
public class ObjectOutputStreamDemo {
public static void main(String[] args) throws IOException {
Person p = new Person("张三",20,new String[] {"吃饭","睡觉","打豆豆"});
FileOutputStream fos = new FileOutputStream("person.obj");
ObjectOutputStream oos = new ObjectOutputStream(fos);
/*
* 要序列化的对象必须实现可序列化的接口
* 否则在进行序列化的时候会报错
* 1.对象流会将指定的对象转换成一组字节(序列化)
* 2.将序列化后的字节写到指定的路径文件中(持久化)
*/
oos.writeObject(p);
System.out.println("程序结束!");
oos.close();
}
}
反序列化操作
将序列化后的文件反序列化为对象,代码如下:
package com.tedu.io;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.ObjectInputStream;
/**
* 使用对象流进行反序列化操作
* @author Wildmess
*
*/
public class ObjectInputStreamDemo {
public static void main(String[] args) throws IOException, ClassNotFoundException {
FileInputStream fis = new FileInputStream("person.obj");
ObjectInputStream ois = new ObjectInputStream(fis);
//Object readObject()返回的是一个Object对象的数据,父类数据不能直接赋给子类,要强转
Person p = (Person)ois.readObject();
System.out.println(p.toString());
//这里可以尝试把Person类中的serialVersionUID的版本号更改后尝试再尝试运行一下
//会报错
ois.close();
}
}