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.为什么需要序列化 ...
随机推荐
- ioremap&buddy system
生死契阔,与子成说,执子之手,与子携老 一.ioremap 1.参考: 理解 (1)http://www.linuxidc.com/Linux/2011-04/34295.htm 代码过程 (1)ht ...
- 结构体structure
结构体是值类型 import Foundation struct TV{ var keyName="a" var keyNumber=9 func getKey()->Int ...
- Linux正则表达式结合三剑客企业级实战
1.取系统ip 解答: 1)ifconfig ens33 |sed -n '2p'|sed "s#inet##g"|sed 's#n.*$##g' 2)ifconfig ens3 ...
- octave
1. octave, 如何求一元二次方程的解: 例如:· -3x-9y=18 · 4x+3y=12 命令: >>> A=[-3 -9; 4 3]; B=[18;12]; &g ...
- 强大的strace命令用法详解
文章转自: https://www.linuxidc.com/Linux/2018-01/150654.htm strace是什么? 按照strace官网的描述, strace是一个可用于诊断.调试和 ...
- 【转帖】知乎管理华为鸿蒙OS的介绍2
作者:虎游链接:https://www.zhihu.com/question/328382980/answer/784629132来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注 ...
- VIM 介绍
gedit a.txt 是一个图形界面的文本编辑器. 需要安装图形界面才会有. nano a.txt 也是一样的 vi 是一种文本界面的编辑器. vim 是 vimsual interfa ...
- Spring注解Component原理源码解析
在实际开发中,我们经常使用Spring的@Component.@Service.@Repository以及 @Controller等注解来实现bean托管给Spring容器管理.Spring是怎么样实 ...
- PAT A1011 World Cup Betting(20)
AC代码 #include <cstdio> #include <algorithm> const int max_n = 3; using namespace std; /* ...
- Linux就该这么学——初识vim编辑器
在Linux系统中一切都是文件,而配置一个服务就是在修改其配置文件的参数 初识Vim编辑器 Vim编辑器顾名思义就是用来编写脚本程序的”记事本” Vim编辑器模式 : 命令模式 : 控制光标移动,可对 ...