说一下个人理解,如果有不对的,希望大家多多指点啊!
如果一个类,实现了Serializable接口,则可以被序列化到本地。
此时,会有一个属性,serialVersionUID,来表示该实体类的版本。
如果没有指定serialVersionUID:
当一个类被序列化后,如果发生了改变,不包括增加空格,换行,增加注释,等等,那么反序列化后,会抛出异常:java.io.InvalidClassException。
这是因为序列化的时候,如果没有指定serialVersionUID,Java序列化机制会根据编译的class(它通过类名,方法名等诸多因素经过计算而得,理论上是一一映射的关系,也就是唯一的)自动生成一个serialVersionUID作序列化版本比较用。
如果一个类发生修改,serialVersionUID则会发生改变。反序列的时候,JVM会把传来的字节流中的serialVersionUID与相应实体(类)的serialVersionUID进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常(InvalidClassException)。
如果指定了serialVersionUID:
如果序列化后,增加了属性或者方法,则反序列化的时候,不会抛异常,但是新增加的属性会被赋予对应类型的默认值,新增加的方法可以调用。
如果序列化后,删除了属性或者方法,则反序列化后,会忽略被删除的属性或方法。
具体实现的例子,参照的文章找不到原创作者,只能贴出参照时的地址:
http://blog.csdn.net/zzjjiandan/article/details/32336079
在此贴出格式化后的测试用代码
测试用的实体类
package test;
import java.io.Serializable;
public class Serial implements Serializable {
private static final long serialVersionUID = 1L;
int id;
String name;
String test;
public Serial(int id, String name,String test) {
this.id = id;
this.name = name;
this.test = test;
}
public String toString() {
return "DATA: " + id + " " + name + " " + test;
}
public void add(){
System.out.println("add");
}
/*public Serial(int id, String name) {
this.id = id;
this.name = name;
}
public String toString() {
// return "DATA: " + id + " " + name + " " + test;
return "DATA: " + id + " " + name;
}*/
}
序列化的类
package test;
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
public class SerialTest {
public static void main(String args[]) {
//Serial serial1 = new Serial(1, "song");
Serial serial1 = new Serial(1, "song","aa");
System.out.println("Object Serial" + serial1);
try {
FileOutputStream fos = new FileOutputStream("serialTest.txt");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(serial1);
oos.flush();
oos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
反序列化的类
package test;
import java.io.FileInputStream;
import java.io.ObjectInputStream;
public class DeserialTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
Serial serial2;
try {
FileInputStream fis = new FileInputStream("serialTest.txt");
ObjectInputStream ois = new ObjectInputStream(fis);
serial2 = (Serial) ois.readObject();
ois.close();
System.out.println("Object Deserial" + serial2);
serial2.add();
} catch (Exception e) { // TODO Auto-generated catch block
e.printStackTrace();
}
}
}