6.1 什么是序列化和反序列化
6.1.1 序列化就是把java对象转换为字节序列的过程
例如我们之前玩单机游戏的时候玩到一定时间不想玩了,想休息一会,哎这个时候我们可以存档,这个存档的动作就是序列化的动作,可以把我们的等级,经验,血量,怪物的血量 等等这些信息 作为对象转换为二进制文件存储在硬盘中,这样我们过再多时间不玩 这些存档依然还在(只要硬盘不被损坏)
6.1.2 反序列化就是把字节序列转换为java对象的过程
反序列化就是把我们之前的游戏存档再读出来转换为对象的过程
6.2 序列化的作用
6.2.1 序列化是以某种存储形式使自定义对象持久化
6.2.2 可以将对象从一个地方传递到另一个地方
6.2.3 使程序更具维护性。
6.3 实现序列化和反序列化的过程
6.3.1 实现序列化的必要要求
只有实现了 Serializable 或者Externalizable 接口的类的对象才能被序列化为字节序列(不是则会抛出异常)
6.3.2 JDK中序列化和反序列化的API:
6.3.2.1 java.io.ObjectInputStream: 输入流
该类的 readObject() 方法从输入流中读取字节序列,然后将字节序列反序列化为一个对象并返回。
6.3.2.2 java.io.ObjectOutputStream: 输出流
该类的 writeObject(Object obj) 方法将传入的 obj 对象进行序列化,把得到的字节序列写入到目标输出流中进行输出
注意:被transient修饰的实例变量不能被序列化化或者反序列化(因为被transient修饰的实例变量是临时实例变量)
序列化和反序列化的代码实例:
public class SerializableTest { public static void main(String[] args) throws IOException, ClassNotFoundException { //序列化 FileOutputStream fos = new FileOutputStream("object.out"); ObjectOutputStream oos = new ObjectOutputStream(fos); User user1 = new User("lihao", "wjwlh", "21"); oos.writeObject(user1); oos.flush(); oos.close(); //反序列化 FileInputStream fis = new FileInputStream("object.out"); ObjectInputStream ois = new ObjectInputStream(fis); User user2 = (User) ois.readObject(); System.out.println(user2.getUserName()+ " " + user2.getPassword() + " " + user2.getAge());
}
public class User implements Serializable{ private static final long serialVersionUID = -6060343040263809614L; private String userName; private String password; private String age; public String getUserName() { return userName; } public String getPassword() { return password; } public void setUserName(String userName) { this.userName = userName; } public void setPassword(String password) { this.password = password; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } public Student(String userName, String password, String age) { this.userName = userName; this.password = password; this.age = age; }