zoukankan      html  css  js  c++  java
  • Java序列化流

    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 }
  • 相关阅读:
    缓存算法之LRU与LFU
    银行家算法
    死锁,死锁的四个必要条件以及处理策略
    找出无序数组中位数的方法
    HTTP状态码
    进程调度算法
    宽字节wchar_t和窄字节char的相互转换
    胜天半子
    ? 题目 一道超难的奥数题,猜生日. A告诉B他生日的月份,告诉C他生日的日期 B说:“如果我不知道A的生日,那C肯定也不知道." C说:”本来我不知道,现在我知道了.“ B说:”哦,那我也知道了.
    有对夫妇生有一男一女,一天晚上,成员中的一个杀了另一个,剩下2个成员,1个是帮凶1个是目击者
  • 原文地址:https://www.cnblogs.com/xugf/p/9141134.html
Copyright © 2011-2022 走看看