序列化:把对象类型数据的状态转为可以存储或者传输的过程
不是所有类都能序列化
不是所有的属性都需要序列化 transient
静态的内容不能被序列化
如果父类实现了序列化,子类对象的所有内容都可以被序列化
如果子类实现序列化,父类没有实现,子类对象只能序列化子类中的内容
例:
public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {
out("D:/test.txt");
in("D:/test.txt");
}
class Person implements Serializable{
private String name;
private transient int age;//transient修饰的没有序列化的能力
static int id;
public Person() {
// TODO Auto-generated constructor stub
}
public Person(String name, int age,int id) {
super();
this.name = name;
this.age = age;
this.id=id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age +",id="+id +"]";
}
}
一、反序列化输入流 ObjectInputStream
ObjectInputStream 确保从流创建的图形中所有对象的类型与 Java 虚拟机中显示的类相匹配。
构造方法
static class ObjectInputStream.GetField
提供对从输入流读取的持久字段的访问权限。
ObjectInputStream is=new ObjectInputStream(new FileInputStream(path));
方法:
Object readObject()
从 ObjectInputStream 读取对象。
步骤
- 选择流
- 读入
- 关闭
实例
//反序列化
public static void in(String path) throws IOException, ClassNotFoundException{
//1.流
ObjectInputStream is=new ObjectInputStream(new FileInputStream(path));
//2.读入
Object obj1=is.readObject();
System.out.println(obj1);
int[] obj2=(int[]) is.readObject();
System.out.println(Arrays.toString(obj2));
//3.关闭
is.close();
}
二、序列化输出流 ObjectOutputStream
将 Java 对象的基本数据类型和图形写入 OutputStream。
构造方法
static class ObjectOutputStream.PutField
提供对要写入 ObjectOutput 的持久字段的编程访问。
ObjectOutputStream os=new ObjectOutputStream(new FileOutputStream(path));
方法:
void writeObject(Object obj)
将指定的对象写入 ObjectOutputStream。
步骤
- 选择流
- 写出
- 刷出
- 关闭
实例
public static void out(String path) throws FileNotFoundException, IOException{
//1.选择流
ObjectOutputStream os=new ObjectOutputStream(new FileOutputStream(path));
//2.写出
Person p=new Person("张三",16,01);
int[] arr={1,2,3,4};
os.writeObject(p);
os.writeObject(arr);
p.setName("李四");
p.id=100;
//3.刷出
os.flush();
//4.关闭
os.close();
}