使用jdk原生的序列化机制,我们要把需要序列化的类实现Serializable接口或者Externalizable(关于Externalizable这个接口稍后我会讲到),我们这里先说Serializable,Serializable这是一个标记接口没有声明任何的方法。
public abstract interface Serializable {
}
(1)序列化的基本操作
下面我们构造一个Book类并实现Serializable接口,代码如下:/**
* 序列化类的模型
* @author yujie.wang
* @since 10/03/2017
*/
public class Book implements Serializable{
//序列化的版本号
private static final long serialVersionUID = 6165984730624879548L;
private String name;
private double price;
private boolean status;
private int rent_days;
private List<String> list;
// transient关键字修饰的域不被序列化
private transient int rentTimes;
// 静态域属于类,不是对象的状态
private static String note = "this is a nice book";
public Book(String name, double price, boolean status, int rent_days, List<String> list,
int rentTimes){
this.name = name;
this.price = price;
this.status = status;
this.rent_days = rent_days;
this.list = list;
this.rentTimes = rentTimes;
}
public int getRentTimes() {
return rentTimes;
}
public void setRentTimes(int rentTimes) {
this.rentTimes = rentTimes;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public boolean isStatus() {
return status;
}
public void setStatus(boolean status) {
this.status = status;
}
public int getRent_days() {
return rent_days;
}
public void setRent_days(int rent_days) {
this.rent_days = rent_days;
}
public List<String> getList() {
return list;
}
public void setList(List<String> list) {
this.list = list;
}
@Override
public String toString() {
return "Book [name=" + name + ", price=" + price + ", status=" + status
+ ", rent_days=" + rent_days + ", list=" + list
+ ", rentTimes=" + rentTimes + "]";
}
}
我们之前说过序列化是保存对象的状态,所以类中的静态变量属于类而不属于对象的状态,所以静态变量是不被序列化的。如果我们有一些不想被序列化的属性,比如程序打开的文件句柄之类的,那么我们可以在这样的域上用transient关键字进行声明。
序列化和反序列化的测试代码如下所示: