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接口的类对象(非静态成员和非瞬时成员数据)从硬盘文件或二进制数据读取到输入流。

 FileInputStream fis = new FileInputStream("t.tmp");
ObjectInputStream ois = new ObjectInputStream(fis); int i = ois.readInt();
String today = (String) ois.readObject();
Date date = (Date) ois.readObject(); ois.close();

4、ObjectOutputStream类

将基本数据类型和实现了java.io.Serializable接口的类对象(非静态成员和非瞬时成员数据)写入到OutputStream流,从而实现对象的持久存储和网络传输。

 FileOutputStream fos = new FileOutputStream("t.tmp");
ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeInt(12345);
oos.writeObject("Today");
oos.writeObject(new Date()); oos.close();

5、基础案例

 public class Person implements Serializable {

     private static final long serialVersionUID = -641073459191474480L;

     private String name;
private int age;
private int weight;
private int height; public Person() {
super();
} public Person(String name, int age, int weight, int height) {
super();
this.name = name;
this.age = age;
this.weight = weight;
this.height = height;
} // getter & setter @Override
public String toString() {
return "Person [name=" + name + ", age=" + age + ", weight=" + weight + ", height=" + height + "]";
}
}
 public class TestSerializable {

     // 对象序列化
private static void writeObject() throws Exception { ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("D:\\person.obj")); Person p1 = new Person("admin1", 20, 170, 60);
Person p2 = new Person("admin2", 21, 171, 61); oos.writeObject(p1);
oos.writeObject(p2); oos.close();
} // 对象反序列化
private static void readObject() throws Exception { ObjectInputStream ois = new ObjectInputStream(new FileInputStream("D:\\person.obj")); Person p1 = (Person) ois.readObject();
Person p2 = (Person) ois.readObject(); System.out.println(p1);
System.out.println(p2); ois.close();
} public static void main(String[] args) throws Exception { // 对象序列化
writeObject(); // 对象反序列化
readObject(); }
}

Java序列化流的更多相关文章

  1. Java序列化流的奇妙之旅

    Java序列化流有何奇妙之处呢?通过一个个案例逐一感受序列化流. !!!好戏在后头!!! 1.IO流读写文件 先从一个普通文件读写字符串开始讲起. 例子:输出字符串到文件,再从文件中读取字符串 在某一 ...

  2. Java序列化流-ObjectOutputStream、ObjectInputStream

    Java对象流的基本概念: 实例代码: 实体类User: import java.io.Serializable; /** * @author zsh * @company wlgzs * @crea ...

  3. java 序列化流与反序列化流

    一 对象序列化流ObjectOutputStream ObjectOutputStream 将 Java 对象的基本数据类型和图形写入 OutputStream.可以使用 ObjectInputStr ...

  4. Java序列化格式详解

    RPC的世界,由于涉及到进程间网络远程通信,不可避免的需要将信息序列化后在网络间传送,序列化有两大流派: 文本和二进制. 文本序列化 序列化的实现有很多方式,在异构系统中最常用的就是定义成人类可读的文 ...

  5. Java API —— IO流(数据操作流 & 内存操作流 & 打印流 & 标准输入输出流 & 随机访问流 & 合并流 & 序列化流 & Properties & NIO)

    1.操作基本数据类型的流     1) 操作基本数据类型 · DataInputStream:数据输入流允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型.应用程序可以使用数据输出 ...

  6. Java基础知识强化之IO流笔记65:序列化流 和 反序列化流

    1. 什么是 序列化 和 反序列化 ?     序列化 (Serialization):将对象的状态信息转换为可以存储或传输的形式的过程.比如转化为二进制.xml.json等的过程. 在序列化期间,对 ...

  7. java中的序列化流和反序列化流

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 16.0px SimSun; color: #4e9072 } 序列化流:把对象按照流一样的方式存入文本文件 ...

  8. 【Java IO流】对象的序列化和反序列化

    对象的序列化和反序列化 1)对象序列化,就是将Object对象转换成byte序列,反之叫对象的反序列化. 2)序列化流(ObjectOutputStream),是字节的过滤流—— writeObjec ...

  9. Java学习笔记32(IO:序列化流)

    对象中的数据 ,以流的形式,写入到文件中保存,过程称为写出对象,对象的序列化 ObjectOutputStream将对象写到序列中,实现序列化 在文件中,以流 的形式,将对象读取出来,过程称为读取对象 ...

随机推荐

  1. array.includes的使用

    看看某个值在不在这个数组里面,是个完整的数 var array1 = [1, 2, 3]; console.log(array1.includes(2)); // expected output: t ...

  2. ICEM-带柱底座

    原视频下载地址:https://pan.baidu.com/s/1c2KgCBA 密码: ixk8

  3. MacBook Air装Windows7双系统后的一些(未尝试)想法

    转载请标注原地址:https://www.cnblogs.com/lixiaojing/p/11458477.html 运行环境: macOS在Mojave下的Boot Camp Assistant只 ...

  4. [Beta]第三次 Scrum Meeting

    [Beta]第三次 Scrum Meeting 写在前面 会议时间 会议时长 会议地点 2019/5/7 22:00 30min 大运村公寓6F寝室 附Github仓库:WEDO 例会照片 工作情况总 ...

  5. MetaPruning: Meta Learning for Automatic Neural Network Channel Pruning

    MetaPruning: Meta Learning for Automatic Neural Network Channel Pruning 2019-08-11 19:48:17 Paper: h ...

  6. Nginx可以做什么?(转载)

    本文只针对Nginx在不加载第三方模块的情况能处理哪些事情,由于第三方模块太多所以也介绍不完,当然本文本身也可能介绍的不完整,毕竟只是我个人使用过和了解到过得,欢迎留言交流. Nginx能做什么 —— ...

  7. oracle 19c jdbc之Reactive Streams Ingestion (RSI) Library

    19c jdbc新特性 https://blogs.oracle.com/dev2dev/whats-new-in-193-and-183-jdbc-and-ucp jdbc实现直接路径加载 http ...

  8. python虛擬環境和工具

    1.命令 pip install virtualenvwrapper-win mkvirtualenv env_xadmin deactivate  退出 pip list pip install m ...

  9. Swift编程语言中如何实现自定义类型的for-in循环(基于Swift 2.2)

    我们在Swift编程语言中常常会用到for-in循环(在编程语言术语中又被称为for-each).此外,从Swift 2.2版本起,for循环将只支持for-in形式,而不支持for i = 0; i ...

  10. LODOP打印超文本有边距不居中的情况2

    之前的博文:LODOP打印项水平居中.之前的博文有介绍超文本和纯文本的居中方式,设置超文本打印项居中时,注意打印内容要在打印项本身宽度里居中.之前的博文超文本用的是个表格,而且表格本身没有margin ...