Java序列化是指把Java对象转换为字节序列的过程;而Java反序列化是指把字节序列恢复为Java对象的过程
Objects persistence对象持久化:对象原本在内存中运行,文件中是一直有效的,现在想将对象存在文件中持久保存。那么对象所对应的那个类必须支持序列化,即类必须实现java.io.Serilization下的接口,否则报java.io.NotSerializableException错误。实现了Serializable接口的类称为可序列化的类。
ObjectInputStream/ObjectOutputStream:以字节为单位进行对象的读、写操作
transient(短暂的、临时的)修饰的属性不会被序列化
import java.io.*;
class Student implements Serializable{
private String name;
private int age;
private transient int grade;
public Student(){}
public Student(String name,int age,int grade) {
this.name = name;
this.age = age;
this.grade = grade;
}
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("name: ");
sb.append(name);
sb.append(",age: ");
sb.append(age);
sb.append(",grade: ");
sb.append(grade);
return sb.toString();
}
}
public class ObjectStreamTest {
public static void test1(String path) {
Student s1 = new Student("Jack",20,70);
Student s2 = new Student("Tom",21,82);
try(ObjectOutputStream oos = new
ObjectOutputStream(new FileOutputStream(path));
){
oos.writeObject(s1);
oos.writeObject(s2);
} catch (IOException e) {
e.printStackTrace();
}
}
public static void test2(String path) {
Student s;
try(
ObjectInputStream ois = new
ObjectInputStream(new FileInputStream(path));
){
s = (Student)ois.readObject();
System.out.println(s);
s = (Student)ois.readObject();
System.out.println(s);
}catch(IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
//写操作
//test1(args[0]);
//读操作
test2(args[0]);
}
}
写操作,写到 object.txt 中,以字节为单位存储的,让程序去读取
读操作,从object.txt中读取
Java的序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的。在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本地相应实体(类)的serialVersionUID进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常(java.io.InvalidClassException)(无效的类异常)
static final long serialVersionUID = 自己给一个数 ;
自己提供,系统就不会默认提供了