一、序列化和反序列化的概念
序列化:把对象转换为字节序列的过程称为对象的序列化。
反序列化:把字节序列恢复为对象的过程称为对象的反序列化。
二、什么情况下需要序列化
当你想把的内存中的对象状态保存到一个文件中或者数据库中时候
当你想用套接字在网络上传送对象的时候
当你想通过RMI传输对象的时候
试验1-正常序列化和反序列化(不声明serialVersionUID)
上代码:
package com.school.eution.accommodation;
import java.io.*;
public class SerializableTest {
public static void main(String[] args) throws Exception {
// 创建对象
Vehicle vehicle = new Vehicle();
vehicle.setModel("奥迪360Ti");
vehicle.setColor("白色");
vehicle.setCountry("德国");
vehicle.setSlogan("土豪必备!");
// 调用序列化方法
serializeHandle(vehicle);
// 调用反序列化方法
Vehicle deserializeVehicle = deserializeHandle();
System.out.println(deserializeVehicle.toString());
}
/**
* 序列化
*
* @author pocher
*/
private static void serializeHandle(Vehicle vehicle) throws Exception {
// 将 vehicle 对象存储到d盘的 vehicle.txt 文件中,完成对vehicle 对象的序列化操作
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(new File("d:/vehicle.txt")));
oos.writeObject(vehicle);
System.out.println("Vehicle 对象序列化成功!");
oos.close();
}
/**
* 反序列化
*
* @author pocher
*/
private static Vehicle deserializeHandle() throws Exception {
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(new File("d:/vehicle.txt")));
Vehicle vehicle = (Vehicle) ois.readObject();
System.out.println("Vehicle 对象反序列化成功!");
return vehicle;
}
}
package com.school.eution.accommodation;
import java.io.Serializable;
public class Vehicle implements Serializable {
// 购车发票
private static String INVOICE = "26DAE221";
// 车辆型号
private String model;
// 车辆颜色
private String color;
// 车辆国籍
private String country;
// 车辆营销标语
private String slogan;
public static String getINVOICE() {
return INVOICE;
}
public static void setINVOICE(String INVOICE) {
Vehicle.INVOICE = INVOICE;
}
public String getModel() {
return model;
}
public void setModel(String model) {
this.model = model;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
public String getSlogan() {
return slogan;
}
public void setSlogan(String slogan) {
this.slogan = slogan;
}
@Override
public String toString() {
return "Vehicle{" +
"model='" + model + '\'' +
", color='" + color + '\'' +
", country='" + country + '\'' +
", slogan='" + slogan + '\'' +
'}';
}
}
运行结果:
Vehicle 对象序列化成功!
Vehicle 对象反序列化成功!
Vehicle{model='奥迪360Ti', color='白色', country='德国', slogan='土豪必备!'}
分析:不声明serialVersionUID的情况下,序列化和反序列化成功。
试验1-序列化成功后,在反序列化前修改对象的属性(不声明serialVersionUID)
将原来的slogan改为slogan2后,发现反序列化时会报错。因此在没有声明 serialVersionUID的时候,不能修改或新增对象属性的时候会报错,换句话说必须保持完全一致才行。
-----------------------------声明serialVersionUID----------------------------------
试验3-声明serialVersionUID的情况下修改对象属性
还是先走一遍正常的序列化、反序列化过程
试验4-修改Vehicle对象属性,再进行反序列化。
分析:声明了serialVersionUID后,修改或新增属性不会报错,只是修改或新增的属性由于和原有序列化的属性对应不上,所以是null。INVOICE由于是static修饰的所以,序列化和发序列话对它的值没有影响。
下面奉上代码:
package com.school.eution.accommodation;
import java.io.Serializable;
public class Vehicle implements Serializable {
private static final long serialVersionUID = 1L;
// 购车发票
private static String INVOICE = "222222222";
// 车辆型号
private String model;
// 车辆颜色
private String color;
// 车辆国籍
private String country;
// 车辆营销标语
private String slogan2;
// 车辆售价
private String salePrice;
public static String getINVOICE() {
return INVOICE;
}
public static void setINVOICE(String INVOICE) {
Vehicle.INVOICE = INVOICE;
}
public String getModel() {
return model;
}
public void setModel(String model) {
this.model = model;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
public String getSlogan2() {
return slogan2;
}
public void setSlogan2(String slogan2) {
this.slogan2 = slogan2;
}
public String getSalePrice() {
return salePrice;
}
public void setSalePrice(String salePrice) {
this.salePrice = salePrice;
}
@Override
public String toString() {
return "Vehicle{" +
"model='" + model + '\'' +
", color='" + color + '\'' +
", country='" + country + '\'' +
", slogan2='" + slogan2 + '\'' +
", salePrice='" + salePrice + '\'' +
'}';
}
}
package com.school.eution.accommodation;
import java.io.*;
public class SerializableTest {
public static void main(String[] args) throws Exception {
/* // 创建对象
Vehicle vehicle = new Vehicle();
vehicle.setModel("奥迪360Ti");
vehicle.setColor("白色");
vehicle.setCountry("德国");
vehicle.setSlogan("土豪必备!");
// 调用序列化方法
serializeHandle(vehicle);*/
// 调用反序列化方法
Vehicle deserializeVehicle = deserializeHandle();
System.out.println(deserializeVehicle.toString());
}
/**
* 序列化
*
* @author pocher
*/
private static void serializeHandle(Vehicle vehicle) throws Exception {
// 将 vehicle 对象存储到d盘的 vehicle.txt 文件中,完成对vehicle 对象的序列化操作
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(new File("d:/vehicle.txt")));
oos.writeObject(vehicle);
System.out.println("Vehicle 对象序列化成功!");
oos.close();
}
/**
* 反序列化
*
* @author pocher
*/
private static Vehicle deserializeHandle() throws Exception {
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(new File("d:/vehicle.txt")));
Vehicle vehicle = (Vehicle) ois.readObject();
System.out.println("Vehicle 对象反序列化成功!");
return vehicle;
}
}