Java 提供了一种对象序列化的机制。用一个字节序列可以表示一个对象,该字节序列包含该对象的数据
、对象的类型
和对象中存储的属性
等信息。字节序列写出到文件之后,相当于文件中持久保存了一个对象的信息。
反之,该字节序列还可以从文件中读取回来,重构对象,对它进行反序列化。对象的数据
、对象的类型
和对象中存储的数据
信息,都可以用来在内存中创建对象。看图理解序
1
java.io.ObjectOutputStream
类,将Java对象的原始数据类型写出到文件,实现对象的持久存储。
构造方法
-
public ObjectOutputStream(OutputStream out)
: 创建一个指定OutputStream的ObjectOutputStream。
FileOutputStream fos= new FileOutputStream("oos.txt");
ObjectOutputStream oos= new ObjectOutputStream(fos);
序列化操作
-
一个对象要想序列化,必须满足两个条件:
-
该类必须实现
java.io.Serializable
接口,Serializable
是一个标记接口,不实现此接口的类将不会使任何状态序列化或反序列化,会抛出NotSerializableException
。 -
该类的所有属性必须是可序列化的。如果有一个属性不需要可序列化的,则该属性必须注明是瞬态的,使用
transient
关键字修饰。
//要进行序列化和反序列话的接口必须要实现Serializable接口,给类添加一个标记,是否允许序列化和反序列还
//没有添加则会报错java.io.NotSerializable
public class User implements Serializable{
private String name;
private int age;
//......
}
}
1
ObjectInputStream反序列化流,将之前使用ObjectOutputStream序列化的原始数据恢复为对象。
构造方法
-
public ObjectInputStream(InputStream in)
反序列化操作
如果能找到一个对象的class文件,我们可以进行反序列化操作,调用ObjectInputStream
读取对象的方法:
-
public final Object readObject ()
: 读取一个对象。
public class Demo02ObjectiInputStream {
public static void main(String[] args) throws IOException, ClassNotFoundException {
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("oos.txt"));
Object o = ois.readObject();
System.out.println(o);
}
}
2.序列和和反序列化一个集合
public class Demo03ObjectList { public static void main(String[] args) throws Exception { ObjectInputStream ois = new ObjectInputStream(new FileInputStream("oos.txt")); ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("oos.txt")); LinkedList<User> list = new LinkedList<>(); list.addLast( new User("hdh",20)); list.addLast( new User("xj",20)); list.addLast( new User("lq",20)); oos.writeObject(list); LinkedList<User> lists = (LinkedList<User>)ois.readObject(); lists.forEach(list1->System.out.println(list1)); oos.close(); ois.close(); } }