1. 对象序列化介绍
对象序列化的目标是将对象保存到磁盘中,或允许在网络中直接传输对象。对象序列化机制允许把内存中的Java对象转换成平台无关的二进制流,从而允许把这种二进制流持久地保存在磁盘上,通过网络将这种二进制流传输到另一个网络节点。其他程序一旦获得了这种二进制流,都可以将这种二进制流恢复成原来的Java对象。 简单来讲,对象序列化就是将内存中的对象数据转换为二进制流进行传输的操作。
对象序列化机制(object serialization)是Java语言内建的一种对象持久化方式,通过对象序列化,可以把对象保存为字节数组,这些字节数组可以保存在磁盘上,或通过网络传输。在有需要的时候将这个字节数组通过反序列化的方式再转换成对象。对象序列化可以很容易的在JVM中的活动对象和字节数组(流)之间进行转换。
在Java中,对象的序列化与反序列化被广泛应用到RMI(远程方法调用)及网络传输中。通常建议:程序创建的每个JavaBean类都实现Serializable。
2. java提供的序列化支持
Java为了方便开发人员将Java对象进行序列化及反序列化提供了一套方便的API来支持。其中包括以下接口和类:
java.io.Serializable
java.io.Externalizable
ObjectOutput
ObjectInput
ObjectOutputStream
ObjectInputStream
要想序列化必须实现java.io.Serializable 接口,未实现此接口的类将无法使其任何状态序列化或反序列化。java.io.Serializable是一种标识接口,表示一种能力,本身没有任何方法。
- 序列化类:java.io.ObjectOutputStream,将对象变为指定格式的二进制数据
- 反序列化类:java.io.ObjectInputStream,可以将序列化的对象转换为对象内容
3. Transient 关键字
Transient 关键字的作用是控制变量的序列化,在变量声明前加上该关键字,可以阻止该变量被序列化到文件中,在被反序列化后,transient 变量的值被设为初始值,如 int 型的是 0,对象型的是 null。Transient关键字只能用于修饰Field,不可修饰Java程序中的其他成分。
4. 通过代码实现序列化与反序列化
- 首先实现Serializable接口
/**
* @author zhaojiaxing
* @date 2020-02-01 21:25
*/
public class Book implements Serializable {
private String title;
private double price;
public Book(String title, double price) {
this.title = title;
this.price = price;
}
@Override
public String toString() {
return "SerializableTest{" +
"title='" + title + '\'' +
", price=" + price +
'}';
}
}
- 将book对象序列化
/**
* 序列化
* @throws Exception
*/
public static void ser() throws Exception{
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(
new File("E:\\demo\\book.txt")));
//序列化对象
oos.writeObject(new Book("java编程思想",121));
oos.close();
}
- 将序列化到磁盘的二进制文件进行反序列化为对象
/**
* 反序列化
* @throws Exception
*/
public static void dser() throws Exception{
ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream(
new File("E:\\demo\\book.txt")
));
//反序列化
Object obj = inputStream.readObject();
Book book = (Book)obj;
System.out.println(book);
inputStream.close();
}