序列化:把对象转换为字节序列的过程称为对象的序列化。
反序列化:把字节序列恢复为对象的过程称为对象的反序列化。
public class FlyPig implements Serializable {
// private static final long serialVersionUID = 1L;
private static String AGE = "269";
private String name;
private String color;
transient private String car;
private String addTip;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public String getCar() {
return car;
}
public void setCar(String car) {
this.car = car;
}
public String getAddTip() {
return addTip;
}
public void setAddTip(String addTip) {
this.addTip = addTip;
}
@Override
public String toString() {
return "FlyPig{" +
"name='" + name + '\'' +
", color='" + color + '\'' +
", car='" + car + '\'' +
", AGE='" + AGE+ '\'' +
'}';
}
}
public class SerializableTest {
public static void main(String[] args) throws Exception {
serializeFlyPig();
FlyPig flyPig = deserializeFlyPig();
System.out.println(flyPig.toString());
}
/**
* 序列化
*/
private static void serializeFlyPig() throws Exception {
FlyPig flyPig = new FlyPig();
flyPig.setColor("black");
flyPig.setName("riemann");
flyPig.setName("audi");
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(new File("d:/flypig.txt")));
oos.writeObject(flyPig);
System.out.println("FlyPig 对象序列化成功!");
oos.close();
}
/**
* 反序列化
*/
private static FlyPig deserializeFlyPig() throws Exception {
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(new File("d:/flypig.txt")));
FlyPig pig = (FlyPig) ois.readObject();
System.out.println("FlyPig 对象反序列化成功!");
return pig;
}
}
结果:序列化成功,静态变量没有序列化,transient修饰的成员变量没有不被实例化。
- 不实现Serializable接口,序列化和反序列化会出现NotSerializableException异常。
- 实现Serializable接口,注释addtip成员变量,先序列化,然后取消addtip成员变量的注释,反序列化发现出现异常InvalidClassException 。
- 我在实体类中没有设置serialVersionUID 赋值,但是Java会自动给我们赋值。添加addTip属性时候,会再次生成serialVersionUID 值,两次的值不一样就会抛异常了。
处理方案:添加 private static final long serialVersionUID = 1L后继续之前这个操作,发现序列化,反序列化没有出现问题。