JAVA 序列化流与反序列化流的常用方式
一,序列化与反序列化:
序列化:把Java对象转换为字节序列的过程。
反序列化:把字节序列恢复为Java对象的过程。
二,序列化流ObjectOutputStream:
可以使用ObjectOutputStream将对象序列化储存到磁盘中(二进制):
构造方法:ObjectOutputStream(OutputStream out)
常用方法:void writeObject(Object obj)
**但是自定义类必须实现java.io.Serializable 接口:
(标记此类可以进行序列化 并 进行序列化编号的设置(若无自己设定编号会在修改类后改变,影响反序列化))
序列化编号自己设定:在类中创建属性long serialVersionUID 来设置。
class A implements java.io.Serializable{…}
三,反序列化流ObjectInputStream:
使用ObjectInputStream将磁盘文件反序列化加载:
构造方法:ObjectInputStream(InputStream in)
常用方法:Object readObject(Object obj)
四,瞬态关键字:transient
在类中被其修饰的属性不可以被序列化(被static修饰的属性也不可以)
总结例子:
import java.io.*;
import java.util.LinkedList;
import java.util.List;
public class Serializabletest implements Serializable { // 实现序列化Serializable接口
final long serialVersionUID = 1; // 设置序列化编号(若不设置,系统会自己设置,但是一旦改动类,序号将改变,会影响后续的反序列化)
private String name; // 属性1
private int age; // 属性2
public Serializabletest(String n, int a){
name = n;
age = a;
}
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;
}
public static void main(String[] args) throws IOException, ClassNotFoundException {
LinkedList<Serializabletest> list = new LinkedList<>(); // 创建容器储存多个对象
list.add(new Serializabletest("海贼王", 21)); // 对添加
list.add(new Serializabletest("火影忍者", 18));
list.add(new Serializabletest("七龙珠", 31));
// 使用序列化流 将list储存到文件1.txt中
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("1.txt"));
out.writeObject(list); // 写入
out.close(); // 刷新并释放序列化流
// 使用反序列化流,将文件1.txt中的数据反序列化并加载到list2中
ObjectInputStream in = new ObjectInputStream(new FileInputStream("1.txt"));
LinkedList<Serializabletest> list2 = (LinkedList<Serializabletest>) in.readObject(); //readObject返回Object,使用使用强制转换为目标容器
// 遍历显示
for(Serializabletest temp: list2){
System.out.println(temp.getName()+" "+temp.getAge());
}
}
}