1、概述
Java 提供了一种对象序列化的机制。用一个字节序列可以表示一个对象,该字节序列包含该 对象的数据 、 对象的 类型 和 对象中存储的属性 等信息。字节序列写出到文件之后,相当于文件中持久保存了一个对象的信息。
反之,该字节序列还可以从文件中读取回来,重构对象,对它进行反序列化。 对象的数据 、 对象的类型 和 对象中 存储的数据 信息,都可以用来在内存中创建对象
序列化
2、ObjectOutputStream
java.io.ObjectOutputStream 类,将Java对象的原始数据类型写出到文件,实现对象的持久存储。
// Person.java
// 类通过实现 java.io.Serializable 接口以启用序列化功能, 不实现此接口的类将不会使任 何状态序列化或反序列化,会抛出 NotSerializableException
// Serializable称为标记性接口
public class Person implements Serializable {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public Person() {
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
// Dem01ObjectOutputStream.java
public class Dem01ObjectOutputStream {
public static void main(String[] args) throws IOException {
String p = "person.txt";
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(p));
oos.writeObject(new Person("小美女", 18));
oos.close();
}
}
3、ObjectInputStream
ObjectInputStream反序列化流,将之前使用ObjectOutputStream序列化的原始数据恢复为对象。
public class Demo02ObjectInputStream {
public static void main(String[] args) throws IOException, ClassNotFoundException {
String p = "person.txt";
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(p));
Object obj = ois.readObject(); // 声明抛出异常ClassNotFoundException(class文件找不到异常)
ois.close();
System.out.println(obj);
Person per = (Person) obj;
System.out.println(per);
}
}
4、transient
1、static关键字:静态关键字
静态优先于非静态加载到内存中(静态优先于对象进入到内存中)
被static修饰的成员变量不能被序列化,序列化都是对象
2、transient关键字:瞬态关键字
被transient修饰的成员变量,不能被序列化
5、序列号冲突异常
异常信息
异常信息
解决方案
解决方案
// Person.java
public class Person implements Serializable {
// 通过添加序列号的方式解决
private static final long serialVersionUID = 1L;
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public Person() {
}
}
5、序列化存储ArrayList
public class Demo03Test {
public static void main(String[] args) throws IOException, ClassNotFoundException {
ArrayList<Person>list = new ArrayList<>();
list.add(new Person("小米", 14));
list.add(new Person("大明", 15));
list.add(new Person("米粒", 16));
String p = "/Users/shiji/study/java/itcast/day02-code/src/com/sj/demo04ObjectStream/list.txt";
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(p));
oos.writeObject(list);
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(p));
Object obj = ois.readObject();
ArrayList ol = (ArrayList) obj;
System.out.println(ol);
}
}
网友评论