1、什么是序列化流
序列化就是把Java对象“流化”,序列化后的Java对象可以保存到本地文件系统,或者通过Socket传输到其他的服务器。
Java中对象序列化有以下特点:
1)类实现java.io.Serializable接口;
2)瞬态或静态的字段无法序列化;
2、使用场景
在一些需要把数据存储到磁盘或者数据缓存的情况下可以使用到序列化
如:
1)web服务器关闭时把会话信息保存到服务器磁盘上;
2)web服务关闭时,把一些待处理的数据保存到服务器磁盘上;
3)mybatis、hibernate整合ehcache、redis、memcached等缓存服务缓存数据库数据,这个是一个比较重要的使用场景
记得以前做项目,有一些需要调用第三方接口给用户充流量、充话费的需求,为了较好的用户体验,使用了异步充值,即用户信息提交后把充值请求保存到消息队列,然后就返回响应给用户,后台有独立线程到消息队列查找请求调用接口完成充值。
为了避免在服务器重启时充值队列丢失,就在服务关闭前把消息队列通过序列化输出流保存到磁盘,在服务启动时从磁盘读取数据反序列化为充值请求对象保存到消息队列,这样充值线程开启时就可以继续给这些用户充值了。
3、ObjectInputStream类
把实现了java.io.Serializable接口的类对象(非静态成员和非瞬时成员数据)从硬盘文件或二进制数据读取到输入流。
1 FileInputStream fis = new FileInputStream("t.tmp"); 2 ObjectInputStream ois = new ObjectInputStream(fis); 3 4 int i = ois.readInt(); 5 String today = (String) ois.readObject(); 6 Date date = (Date) ois.readObject(); 7 8 ois.close();
4、ObjectOutputStream类
将基本数据类型和实现了java.io.Serializable接口的类对象(非静态成员和非瞬时成员数据)写入到OutputStream流,从而实现对象的持久存储和网络传输。
1 FileOutputStream fos = new FileOutputStream("t.tmp"); 2 ObjectOutputStream oos = new ObjectOutputStream(fos); 3 4 oos.writeInt(12345); 5 oos.writeObject("Today"); 6 oos.writeObject(new Date()); 7 8 oos.close();
5、基础案例
1 public class Person implements Serializable { 2 3 private static final long serialVersionUID = -641073459191474480L; 4 5 private String name; 6 private int age; 7 private int weight; 8 private int height; 9 10 public Person() { 11 super(); 12 } 13 14 public Person(String name, int age, int weight, int height) { 15 super(); 16 this.name = name; 17 this.age = age; 18 this.weight = weight; 19 this.height = height; 20 } 21 22 // getter & setter 23 24 @Override 25 public String toString() { 26 return "Person [name=" + name + ", age=" + age + ", weight=" + weight + ", height=" + height + "]"; 28 } 29 }
1 public class TestSerializable { 2 3 // 对象序列化 4 private static void writeObject() throws Exception { 5 6 ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("D:\person.obj")); 7 8 Person p1 = new Person("admin1", 20, 170, 60); 9 Person p2 = new Person("admin2", 21, 171, 61); 10 11 oos.writeObject(p1); 12 oos.writeObject(p2); 13 14 oos.close(); 15 } 16 17 // 对象反序列化 18 private static void readObject() throws Exception { 19 20 ObjectInputStream ois = new ObjectInputStream(new FileInputStream("D:\person.obj")); 21 22 Person p1 = (Person) ois.readObject(); 23 Person p2 = (Person) ois.readObject(); 24 25 System.out.println(p1); 26 System.out.println(p2); 27 28 ois.close(); 29 } 30 31 public static void main(String[] args) throws Exception { 32 33 // 对象序列化 34 writeObject(); 35 36 // 对象反序列化 37 readObject(); 38 39 } 40 }