序列化是一种对象的传输手段。
对象序列化,就是把一个对象变为二进制的数据流的一种方法。通过对象序列化可以方便的实现对象的传输或存储。
一个类的对象想被序列化,则对象所在的类必须实现java.io.Serializable接口。然而此接口并没有提供任何的抽象方法,所以该接口就是一个标识接口,只是表示一种对象可以被序列化的能力。
对于对象序列化和反序列化的具体实现,则需要依靠ObjectOutputStream与ObjectInputStream两类完成。
- ObjectOutputStream:可以将对象转为特定格式的二进制数据输出;
- ObjectInputStream:可以读取ObjectOutputStream类输出的二进制对象数据,并将其转为具体类型的对象返回。
1、定义序列化对象类:
package com.mydemo;
import java.io.*;
public class FileIODemo {
// 本次操作将要序列化的对象保存到文件中,将文件定义为公共常量
private static final File SAVE_FILE = new File("e:" + File.separator + "test.txt");
public static void main(String[] args) throws Exception {
// 对象序列化
saveObject(new Member("张三", 18));
// 对象反序列化
System.out.println(loadObject());
}
/**
* 序列化操作---输出流
*
* @param o
* @throws Exception
*/
public static void saveObject(Object o) throws Exception {
ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(SAVE_FILE));
// 序列化
objectOutputStream.writeObject(o);
objectOutputStream.close();
}
/**
* 反序列化---读取流
*
* @return
* @throws Exception
*/
public static Object loadObject() throws Exception {
ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(SAVE_FILE));
// 反序列化
Object obj = objectInputStream.readObject();
objectInputStream.close();
return obj;
}
}
// 定义序列化对象类
@SuppressWarnings("serial") // 序列化需要序列化编号,该编号编译时可以自动生成
class Member implements Serializable {
private String name;
// private int age;
/**
* 有些属性可能并不需要进行序列化的处理,
* 这个时候就可以在属性定义上使用“transient”关键字来完成了。
* <p>
* 该程序进行Member类对象序列化处理时,age属性的内容是不会被保存下来的,
* 这样在进行对象反序列化操作时,age使用的将是其对应数据类型的默认值。
*/
private transient int age;
public Member(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Member{" +
"姓名:'" + this.name + '\'' +
", 年龄:" + this.age +
'}';
}
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;
}
}
运行结果:
Member{姓名:'张三', 年龄:0}