/**Serializable接口也叫标记型接口
* 要进行序列化和反序列化的类必须实现Serializable接口 给类添加一个标记
* 当进行序列华和反序列华的时候 就会类上是否有这个标记
* 存在:就可以序列华和反序列化
* 不存在:抛出NotSerializableException
*/
public class Person implements Serializable {
private int age;
private String name;
/**在执行反序列化列子时抛出异常:
Exception in thread "main" java.io.InvalidClassException: demo10ObjectStream.Person;
local class incompatible: stream classdesc serialVersionUID = -7525509205900623419,
local class serialVersionUID =-4720418813128480067
*/
private static final long serialVersionUID = -7525509205900623419L;
public Person() {
}
@Override
public String toString() {
return "Person{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
public Person(int age, String name) {
this.age = age;
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
序列化:ObjectOutputStream类
Java 提供了一种对象序列化的机制。用一个字节序列可以表示一个对象,该字节序列包含该 对象的数据 、 对象的类型 和 对象中存储的属性 等信息。字节序列写出到文件之后,相当于文件中持久保存了一个对象的信息。
public class demo01ObjectOutputStream {
public static void main(String[] args) throws IOException {
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("C:\\Users\\LIANG\\Desktop\\test.txt"));
oos.writeObject(new Person(12,"小名"));
oos.close();
}
}
反序列化: ObjectInputStream类
ObjectInputStream反序列化流,将之前使用ObjectOutputStream序列化的原始数据恢复为对象。
//当不存在class文件时 抛出ClassNotFoundException
public class demo02ObjectInputStream {
public static void main(String[] args) throws IOException, ClassNotFoundException {
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("C:\\Users\\LIANG\\Desktop\\test.txt"));
Object o = ois.readObject();
ois.close();
System.out.println(o);
}
}
静态关键字(static)和瞬态关键字(transient)
- static
静态优先非静态加载到内存中(静态优先对象进入到内存中)
被static 修饰的成员变量不能被序列化 只有对象可以
- transient
被transient修饰的成员也不能被序列化