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接口的类对象(非静态成员和非瞬时成员数据)从硬盘文件或二进制数据读取到输入流。
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序列化流的更多相关文章
- Java序列化流的奇妙之旅
Java序列化流有何奇妙之处呢?通过一个个案例逐一感受序列化流. !!!好戏在后头!!! 1.IO流读写文件 先从一个普通文件读写字符串开始讲起. 例子:输出字符串到文件,再从文件中读取字符串 在某一 ...
- Java序列化流-ObjectOutputStream、ObjectInputStream
Java对象流的基本概念: 实例代码: 实体类User: import java.io.Serializable; /** * @author zsh * @company wlgzs * @crea ...
- java 序列化流与反序列化流
一 对象序列化流ObjectOutputStream ObjectOutputStream 将 Java 对象的基本数据类型和图形写入 OutputStream.可以使用 ObjectInputStr ...
- Java序列化格式详解
RPC的世界,由于涉及到进程间网络远程通信,不可避免的需要将信息序列化后在网络间传送,序列化有两大流派: 文本和二进制. 文本序列化 序列化的实现有很多方式,在异构系统中最常用的就是定义成人类可读的文 ...
- Java API —— IO流(数据操作流 & 内存操作流 & 打印流 & 标准输入输出流 & 随机访问流 & 合并流 & 序列化流 & Properties & NIO)
1.操作基本数据类型的流 1) 操作基本数据类型 · DataInputStream:数据输入流允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型.应用程序可以使用数据输出 ...
- Java基础知识强化之IO流笔记65:序列化流 和 反序列化流
1. 什么是 序列化 和 反序列化 ? 序列化 (Serialization):将对象的状态信息转换为可以存储或传输的形式的过程.比如转化为二进制.xml.json等的过程. 在序列化期间,对 ...
- java中的序列化流和反序列化流
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 16.0px SimSun; color: #4e9072 } 序列化流:把对象按照流一样的方式存入文本文件 ...
- 【Java IO流】对象的序列化和反序列化
对象的序列化和反序列化 1)对象序列化,就是将Object对象转换成byte序列,反之叫对象的反序列化. 2)序列化流(ObjectOutputStream),是字节的过滤流—— writeObjec ...
- Java学习笔记32(IO:序列化流)
对象中的数据 ,以流的形式,写入到文件中保存,过程称为写出对象,对象的序列化 ObjectOutputStream将对象写到序列中,实现序列化 在文件中,以流 的形式,将对象读取出来,过程称为读取对象 ...
随机推荐
- 第10组alpha冲刺(2/4)
队名:凹凸曼 组长博客 作业博客 组员实践情况 童景霖 过去两天完成了哪些任务 文字/口头描述 继续学习Android studio和Java 完善项目APP原型 展示GitHub当日代码/文档签入记 ...
- Linux命令及作用
uname -r :查看当前使用的Linux内核版本信息 cat /proc/cpuinfo:查看当前主机CPU型号,规格等信息 cat /proc/meminfo :查看当前主机内存信息 hostn ...
- Hadoop(五)—— HDFS NameNode、DataNode工作机制
一.NN与2NN工作机制 NameNode(NN) 1.当HDFS启动时,会加载日志(edits)和镜像文件(fsImage)到内存中. 2-4.当元数据的增删改查请求进来时,NameNode会先将操 ...
- 第07组 Beta冲刺(4/5)
队名:摇光 队长:杨明哲 组长博客:求戳 作业博客:求再戳 队长:杨明哲 过去两天完成了哪些任务 文字/口头描述:已经完成代码编辑器,暂时没有其他任务 展示GitHub当日代码/文档签入记录:(组内共 ...
- javassist使用全解析
Java 字节码以二进制的形式存储在 .class 文件中,每一个 .class 文件包含一个 Java 类或接口.Javaassist 就是一个用来 处理 Java 字节码的类库.它可以在一个已经编 ...
- Nginx系列 | [转]Nginx 上传文件:client_max_body_size 、client_body_buffer_size
原文:http://php-note.com/article/detail/488 client_max_body_size client_max_body_size 默认 1M,表示 客户端请求服务 ...
- Facets:一款Google开源机器学习数据集可视化工具
Homepage/演示网站:https://pair-code.github.io/facets/ Pypi:https://pypi.org/project/facets-overview/ Git ...
- Sharding-JDBC 按日期时间分库分表
简介 Sharding-JDBC 定位为轻量级Java框架,在Java的JDBC层提供的额外服务. 它使用客户端直连数据库,以jar包形式提供服务,无需额外部署和依赖,可理解为增强版的JDBC驱动,完 ...
- C#中的断言(Assert)
重构-断言 现象:某一段代码需要对程序状态做出某种假设 做法:以断言明确表现这种假设 动机: 常常有这种一段代码:只有某个条件为真是,该改名才能正常运行. 通常假设这样的假设并没有代码中明确表现出来, ...
- python中pygame游戏打包为exe文件
pyinstaller打包游戏的方法: 1.在命令窗口安装pyinstaller ->pip install pyinstaller 2.查看安装的版本信息 pyinstaller -v 3.进 ...