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将对象写到序列中,实现序列化 在文件中,以流 的形式,将对象读取出来,过程称为读取对象 ...
随机推荐
- 分享一些好用的 Chrome 扩展
阅读本文大概需要 2.8 分钟. 前言 使用浏览器扩展程序可以使你的工作效率提高数倍不止,那么下面我就向大家分享一下我日常使用的扩展,可能大多数扩展大家都已经在使用了,不过也难免有一两个是你不知道的. ...
- if, if/else, if /elif/else,case
一.if语句用法 if expression then command fi 例子:使用整数比较运算符 read -p "please input a integer:" a if ...
- Spring Cloud Ribbon---微服务调用和客户端负载均衡
前面分析了Eureka的使用,作为服务注册中心,Eureka 分为 Server 端和 Client 端,Client 端作为服务的提供者,将自己注册到 Server 端,Client端高可用的方式是 ...
- 工具系列 | VScode Remote 远程开发与调试(告别SSH)
简介 最近VScode发布了远程编程与调试的插件Remote Development,使用这个插件可以在很多情况下代替vim直接远程修改与调试服务器上的代码,同时具备代码高亮与补全功能,就和在本地使用 ...
- Python模块安装方法
安装Python模块 电子邮件 distutils-sig @ python .组织 作为一个受欢迎的开源开发项目,Python具有活跃的贡献者和用户支持社区,并且根据开放源代码许可条款,其软件可供其 ...
- PostgreSQL体系架构与内存结构
PostgreSQL体系架构 PostgreSQL的内存结构
- 026_如何在MAC下输入主要国家货币符号?
由于出国旅游啥的经常会记录一些东西,不避免的会遇到各种货币符号 一. 人民币: ¥(sogo输入法切换到中文模式,然后"shift键 + 4"即可) 美元: $(sogo输入法切换 ...
- Python的传递引用
在研究神经网络的反向传播的时候,不解一点,就是修改的是神经网络的paramets,为什么影响内部的神经元(层),比如Affine层:因为除了创建的时候,使用params作为Affine层的构造函数参数 ...
- java打包小记
1.一个类的 Hello.java class Hello{ public static void main(String[] agrs){ System.out.println("hell ...
- laravel composer vendor 目录加载类库详细 之后做说明
composer installLoading composer repositories with package informationInstalling dependencies (inclu ...