序列化:将对象状态转换为可保持或传输的格式的过程。
与序列化相对的是反序列化,它将流转换为对象。
这两个过程结合起来,可以轻松地存储和传输数据,在Java中的这个Serializable接口其实是给jvm看的,通知jvm,我不对这个类做序列化了,你(jvm)帮我序列化就好了。
如果我们没有自己声明一个serialVersionUID变量,接口会默认生成一个serialVersionUID,默认的serialVersinUID对于class的细节非常敏感,反序列化时可能会导致InvalidClassException这个异常(每次序列化都会重新计算该值(添加属性/删除属性默认的都会变化))
/**序列化:把对象生成文件到本地*/
static void testSerializable() throws Exception {
String path = "/Users/xxx/java/workspace/serializable";
FileUtils.mkdirs(path); // 防止文件不存在
String name = path + "/student";
List<Student> list = new ArrayList<>();
list.add(new Student(1, "A", 11));
list.add(new Student(2, "B", 12));
FileOutputStream fo = new FileOutputStream(name);
ObjectOutputStream os = new ObjectOutputStream(fo);
os.writeObject(list);
os.close();
}
/**反序列化:把文件解析成对象*/
static void testParseSerializable() throws Exception {
String path = "/Users/xxx/java/workspace/serializable";
FileUtils.mkdirs(path);
String name = path + "/student";
FileInputStream fi = new FileInputStream(name);
ObjectInputStream oi = new ObjectInputStream(fi);
List<Student> listRead = (List<Student>) oi.readObject();
oi.close();
System.out.println(listRead);
}
public class Student implements Serializable {
private static final long serialVersionUID = -5754403511422945854L;
int id;
String name;
Integer age;
public Student(int id, String name, Integer age) {
this.id = id;
this.name = name;
this.age = age;
}
@Override
public String toString()
}
如果指定了 serialVersionUID 那么对象 删除/添加属性 都不会对反序列化有影响