Java 对象序列化和反序列化 (实现 Serializable 接口)
序列化和反序列化的概念
把对象转换为字节序列的过程称为对象的序列化。
把字节序列恢复为对象的过程称为对象的反序列化。
对象的序列化主要有两种用途:
1) 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;
2) 在网络上传送对象的字节序列。
JDK类库中的序列化API
java.io.ObjectOutputStream代表对象输出流,它的writeObject(Object obj)方法可对参数指定的obj对象进行序列化,把得到的字节序列写到一个目标输出流中。
java.io.ObjectInputStream代表对象输入流,它的readObject()方法从一个源输入流中读取字节序列,再把它们反序列化为一个对象,并将其返回。
只有实现了Serializable和Externalizable接口的类的对象才能被序列化。Externalizable接口继承自 Serializable接口,实现Externalizable接口的类完全由自身来控制序列化的行为,
而仅实现Serializable接口的类可以 采用默认的序列化方式 。
对象序列化包括如下步骤:
1) 创建一个对象输出流,它可以包装一个其他类型的目标输出流,如文件输出流;
2) 通过对象输出流的writeObject()方法写对象。
对象反序列化的步骤如下:
1) 创建一个对象输入流,它可以包装一个其他类型的源输入流,如文件输入流;
2) 通过对象输入流的readObject()方法读取对象。
示例:
新建一个Car 类
package com.oukele.redis2.entity; import java.io.Serializable; public class Car implements Serializable { /*
* 编号
*/
private int id;
/*
* 车名
*/
private String name;
/*
* 车速
*/
private double speed; public Car(String name,double speed ){
this.name = name;
this.speed = speed;
} public Car(int id, String name, double speed) {
this.id = id;
this.name = name;
this.speed = speed;
} public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public double getSpeed() {
return speed;
} public void setSpeed(double speed) {
this.speed = speed;
} @Override
public String toString() {
return "Car{" +
"id=" + id +
", name='" + name + '\'' +
", speed=" + speed +
'}';
}
}
新建一个 SerializeUtil 类 (封装 序列化 和 反序列化 的方法,便于调用 )
package com.oukele.redis2.util; import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream; public class SerializeUtil { /*
* 序列化
* */
public static byte[] serialize(Object object){
//序列化流 (输出流) --> 表示向一个目标 写入数据
ObjectOutputStream objectOutputStream =null;
//字节数组输出流
ByteArrayOutputStream byteArrayOutputStream = null;
try{
//创建一个缓冲区
byteArrayOutputStream = new ByteArrayOutputStream();
//将 对象 序列化成 字节后 输入缓冲区中
objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
//序列化 对象
objectOutputStream.writeObject(object);
//得 到 序列化字节
byte[] bytes = byteArrayOutputStream.toByteArray(); //清空输出流
objectOutputStream.flush();
//释放资源
objectOutputStream.close(); return bytes;
}catch (Exception e){
System.out.println("出现异常:"+e.getMessage());
}
return null;
} /*
* 反序列化
* */ public static <T> T deserialize(byte[] bytes,Class<T> clazz){
//字节数组
ByteArrayInputStream byteArrayInputStream = null;
try{
//将 得到的序列化字节 丢进 缓冲区
byteArrayInputStream = new ByteArrayInputStream(bytes);
//反序列化流 (输入流)--> 表示着从 一个 源头 读取 数据 , (读取 缓冲区中 的字节)
ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);
//反序化成 一个对象
return (T)objectInputStream.readObject();
}catch (Exception e){
System.out.println("出现异常:"+e.getMessage());
}
return null;
} }
测试:
//序列化一个对象
byte[] serialize = SerializeUitl.serialize(new Car(2,"宝马",88.8));
//反序列化
Car deserialize = SerializeUitl.deserialize(serialize, Car.class);
System.out.println(deserialize);
测试结果:
示例源码地址:
Java 对象序列化和反序列化 (实现 Serializable 接口)的更多相关文章
- java 对象序列化与反序列化
Java序列化与反序列化是什么? 为什么需要序列化与反序列化? 如何实现Java序列化与反序列化? 本文围绕这些问题进行了探讨. 1.Java序列化与反序列化 Java序列化是指把Java对象转换为 ...
- Java对象序列化和反序列化的工具方法
import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import ja ...
- Java对象序列化与反序列化一 JSON
Java对象序列化与反序列化一 JSON 1. 依赖库 jackson-all-1.6.1.jar 2. 代码 public class Student { private String nam ...
- Java 对象序列化和反序列化
之前的文章中我们介绍过有关字节流字符流的使用,当时我们对于将一个对象输出到流中的操作,使用DataOutputStream流将该对象中的每个属性值逐个输出到流中,读出时相反.在我们看来这种行 ...
- Java对象序列化与反序列化
对象序列化的目标是将对象保存在磁盘中或者在网络中进行传输.实现的机制是允许将对象转为与平台无关的二进制流. java中对象的序列化机制是将允许对象转为字节序列.这些字节序列可以使Java对象脱离程序存 ...
- java对象序列化、反序列化
平时我们在Java内存中的对象,是无法进行IO操作或者网络通信的,因为在进行IO操作或者网络通信的时候,人家根本不知道内存中的对象是个什么东西,因此必须将对象以某种方式表示出来,即存储对象中的状态.一 ...
- JAVA对象序列化和反序列化学习
JAVA序列化就是将JAVA对象转化为字节序列的过程,而JAVA反序列化就是将字节序列转化为JAVA对象的过程. 这一过程是通过JAVA虚拟机独立完成,所以一个对象序列化后可以在任意时间和任意机器上反 ...
- java对象序列化和反序列化,redis存入和获取对象
最近使用redis发现直接存储序列化后的对象更方便,现提供java序列化和反序列化的代码 1.序列化代码: public static byte[] serialize(Object object) ...
- Java基础—序列化与反序列化(转载)
转载自: Java序列化与反序列化 1.Java序列化与反序列化 Java序列化是指把Java对象转换为字节序列的过程:而Java反序列化是指把字节序列恢复为Java对象的过程. 2.为什么需要序列化 ...
随机推荐
- ByteArrayInputStream类
一.说明 哈哈,这是学习Java之路的第一篇博文.虽然说接触学习Java有一段时间了,但是对流的概念一直并不是很清楚.也看了很多资料,但是感觉还是非常的抽象很难去理解.但是流又是Java中很重要的一部 ...
- PAT A1016 Phone Bills (25)
题目描述 A long-distance telephone company charges its customers by the following rules: Making a long-d ...
- javascript的一些有用函数记录,不断更新。。。
addLoadEvent函数: 众所周知,html文档加载完后会立即执行一个onload函数.但是onload函数只能包含一个被执行的函数,也就是你需要在加载完文档后执行的一个自己的函数.在实际中ht ...
- Elasticsearch5.x安装及常见错误的解决方法
Elasticsearch是基于java开发的,机器上必须要先java环境,elasticsearch5.x建议用jdk8的最新版本.下面介绍elasticsearch5.x的安装步骤: 一.安装El ...
- 思科设备ACL与NAT技术
ACL 访问控制列表(Access Control Lists),是应用在路由器(或三层交换机)接口上的指令列表,用来告诉路由器哪些数据可以接收,哪些数据是需要被拒绝的,ACL的定义是基于协议的,它适 ...
- [多平台]pymo – 手机上的 GalGame 引擎
[多平台]pymo – 手机上的 GalGame 引擎 介绍下这个能在手机上玩移植 GalGame 的游戏引擎,不知道有多少人听过呢?相信如果有喜欢在手机上玩 GalGame 的同学肯定听过类似的东西 ...
- Centos7.3安装Oracle11.2.0.3
1.创建用户用户组 [root@smallcloud ~]# groupadd oinstall [root@smallcloud ~]# groupadd dba [root@smallcloud ...
- id和class的区别
id和class是定义css样式用到的,不同的是定义样式时的写法不一样,使用id选择样式时,定义的格式为 #main{width:20px;} ,使用class时用到的是 .main{width:20 ...
- Delphi 图像组件(Image)
樊伟胜
- 【转】(深入理解计算机系统) bss段,data段、text段、堆(heap)和栈(stack)
bss段: bss段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域. bss是英文Block Started by Symbol的简称. bss段属于静态内存分配. ...