1、什么是序列化与反序列化?
序列化:指把堆内存中的 Java 对象数据,通过某种方式把对象存储到磁盘文件中或者传递给其他网络节点(在网络上传输)。这个过程称为序列化。通俗来说就是将数据结构或对象转换成二进制串的过程
反序列化:把磁盘文件中的对象数据或者把网络节点上的对象数据,恢复成Java对象模型的过程。也就是将在序列化过程中所生成的二进制串转换成数据结构或者对象的过程
1.1 对象序列化流ObjectOutputStream
ObjectOutputStream 将 Java 对象的基本数据类型和图形写入 OutputStream。可以使用 ObjectInputStream 读取(重构)对象。通过在流中使用文件可以实现对象的持久存储。
第一步:创建一个 JavaBean 对象
public class Person implements Serializable{
private String name;
private int age;
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 + "]";
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
}
如果新建的 Person 对象没有实现 Serializable 接口,那么上面的操作会报错:
第二步:使用 ObjectOutputStream 对象实现序列化
public static void main(String[] args) throws IOException { FileOutputStream fos = new FileOutputStream("D:\java1018\person.txt"); ObjectOutputStream oos =new ObjectOutputStream(fos); Person p =new Person("zhangsan",18); oos.writeObject(p); oos.close(); }
第三步:使用ObjectInputStream 对象实现反序列化
public static void main(String[] args) throws ClassNotFoundException, IOException { FileInputStream fis = new FileInputStream("D:\java1018\person.txt"); ObjectInputStream ois = new ObjectInputStream(fis); Object o= ois.readObject(); System.out.println(o); ois.close(); }
如果某些数据不需要做序列化,比如密码,比如上面的年龄?
解决办法:在字段面前加上 transient
private String name;//需要序列化 transient private int age;//不需要序列化