什么是Java序列化和反序列化?
一、先来说说什么是序列化和反序列化?
java对象序列化的意思就是将对象的状态转换成字节流,以后可以通过这些值在生成相同状态的对象,对象序列化就是对象持久化的一种实现方法,它是将对象的属性和方法转化为一种序列化的形式用于存储和传输,反序列化就是根据这些保存的信息重建对象的过程。
总之:
序列化就是将java对象转化为字节序列的过程
反序列化就是将字节序列转换为java对象的过程
二、那么我们为什么要进行序列化呢?
当我们两个进程进行远程通信的时候,可以相互发送各种类型的数据,包括文本,图片等,然后这些数据都会以二进制序列的形式在网络上传送,那么两个java进程在通信的时候也可以实现对象的传送,这个时候就需要Java序列化了
发送方需要把java对象转换为字节序列然后在网络上进行传送,接收方需要从字节序列中恢复出java对象
三、那么Java序列化的好处是什么?
好处一:实现了数据的持久化,
好处二:利用序列化实现远程通信,在网络上进行对象的字节序列传送
四、涉及到序列化和反序列化的JavaApi
- java.io.ObjectOutputStream 表示对象输出流,它的writeObject(Object) 方法可以对参数指定的obj对象进行序列化,把得到的字节序列写到一个目标输出流中
- java.io.ObjectInputStream 表示对象输入流,它的readObject()方法从输入流中读取字节序列,再把他们反序列化成为一个对象并且返回
只有实现了Serialzable或者Externalizable 接口的类的对象才能被序列化,否则抛出异常
五、现在我们通过代码来说明如何实现序列化和反序列化:
1.先创建一个实体类:
package com.example.entity;/** Copyright 2013-2020 Smartdot Technologies Co., Ltd. All rights reserved.* SMARTDOT PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.**/import java.io.Serializable;/*** <p>** @author <a href="mailto:heyf@smartdot.com.cn">heyf</a>* @version 1.0, 2020-11-21 09:43:22* @class* @date 2020-11-21 09:43:22* @see </p>*/
public class SerialEntity implements Serializable {private String age;private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getAge() {return age;}public void setAge(String age) {this.age = age;}}
2.创建一个类用来实现序列化:
package com.example.controller;/** Copyright 2013-2020 Smartdot Technologies Co., Ltd. All rights reserved.* SMARTDOT PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.**/import com.example.entity.SerialEntity;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;/*** 序列化* <p>** @class ObjSerializeAndDeserializeTest* @date 2020-11-21 09:39:29* @author <a href="mailto:heyf@smartdot.com.cn">heyf</a>* @version 1.0, 2020-11-21 09:39:29* @see </p>*/public class ObjSerializeAndDeserializeTest {public static void main(String[] args) {SerializePerson();}/** @Author HYF* @Description //TODO验证序列化id存在的意义* @Date 9:41 2020/11/21* @Param []* @return void**/public static void SerializePerson(){Logger logger = LoggerFactory.getLogger(ObjSerializeAndDeserializeTest.class);SerialEntity serialEntity=new SerialEntity();serialEntity.setAge("30");//创建一个输出流ObjectOutputStream outputStream=null;try{outputStream=new ObjectOutputStream(new FileOutputStream("D:\\1.实习\\-quartz-demo\\static\\test.txt"));//outputStream.writeObject(serialEntity);logger.info(serialEntity.toString());logger.info("序列化成功");} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {try{//关闭输出流outputStream.close();}catch(IOException e){e.printStackTrace();}}}
}
运行结果:
文件内容: 不要直接用txt记事本打开要用文本编辑器打开会乱码,我没有,所有大家凑合看吧
3、反序列化代码: 从文件中读取内容并且打印出来
package com.example.controller;/** Copyright 2013-2020 Smartdot Technologies Co., Ltd. All rights reserved.* SMARTDOT PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.**/import com.example.entity.SerialEntity;
import org.apache.ibatis.javassist.util.proxy.ProxyObjectInputStream;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.ObjectInputStream;/*** 反序列化,从文件中读取内容并且打印出来* <p>** @author <a href="mailto:heyf@smartdot.com.cn">heyf</a>* @version 1.0,* @class* @date* @see </p>*/
public class ObjSerializeAndDeserializeTest2 {public static void main(String[] args) {Logger logger= LoggerFactory.getLogger(ObjSerializeAndDeserializeTest2.class);SerialEntity serialEntity=DeserializePersion();logger.info(serialEntity.getAge());logger.info(serialEntity.getName());}private static SerialEntity DeserializePersion(){SerialEntity person = null;ObjectInputStream inputStream = null;try {inputStream = new ObjectInputStream(new FileInputStream("D:\\1.实习\\-quartz-demo\\static\\test.txt"));try {person = (SerialEntity) inputStream.readObject();System.out.println("执行反序列化过程成功。");} catch (ClassNotFoundException e) {e.printStackTrace();}} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {try {inputStream.close();} catch (IOException e) {e.printStackTrace();}}return person;}
}
以上就是我们序列化和反序列化的过程。
但是如果正规来说我们的实体中缺少了一个显示定义的serialVersionUID,什么是serialVersionUID? 这个东西有什么作用?好处是什么?
敬请关注下一遍博客。
什么是Java序列化和反序列化?相关推荐
- java 序列化概念和作用_结合代码详细解读Java序列化与反序列化概念理解
Java序列化与反序列化是什么?为什么需要序列化与反序列化?如何实现Java序列化与反序列化?本文围绕这些问题进行了探讨. 1.Java序列化与反序列化 Java序列化是指把Java对象转换为字节序列 ...
- Java中如何引用另一个类里的集合_【18期】Java序列化与反序列化三连问:是什么?为什么要?如何做?...
Java序列化与反序列化是什么? Java序列化是指把Java对象转换为字节序列的过程,而Java反序列化是指把字节序列恢复为Java对象的过程: 序列化:对象序列化的最主要的用处就是在传递和保存对象 ...
- java序列化与反序列化(转)
Java序列化与反序列化是什么?为什么需要序列化与反序列化?如何实现Java序列化与反序列化?本文围绕这些问题进行了探讨. 1.Java序列化与反序列化 Java序列化是指把Java对象转换为字节序列 ...
- java序列化和反序列化以及序列化ID的作用分析
java序列化和反序列化 一.概念 java对象序列化的意思就是将对象的状态转化成字节流,以后可以通过这些值再生成相同状态的对象.对象序列化是对象持久化的一种实现方法,它是将对象的属性和方法转化为一 ...
- java序列化和反序列化_Java恶意序列化背后的历史和动机
java序列化和反序列化 与Java的序列化机制相关的问题已广为人知. 有效的Java 1st Edition (第10章)和有效的Java 2nd Edition (第11章)的整个最后一章都专门讨 ...
- 教你彻底学会Java序列化和反序列化
Java序列化是什么? Java序列化是指把Java对象转换为字节序列的过程,Java反序列化是指把字节序列恢复为Java对象的过程.反序列化:客户端重文件,或者网络中获取到文件以后,在内存中重构对象 ...
- 理论 | 教你彻底学会Java序列化和反序列化
这是小小本周的第四篇 Java序列化是什么? Java序列化是指把Java对象转换为字节序列的过程,Java反序列化是指把字节序列恢复为Java对象的过程.反序列化:客户端重文件,或者网络中获取到文件 ...
- Java序列化与反序列化(一)
目录 序列化与反序列化 1.最简单的使用:Serializable 接口 2. 序列化 ID 的问题 3. 静态字段不会序列化 4. 屏蔽字段:transient 5. 父类的序列化 6. 自定义序列 ...
- Serializable详解(1):代码验证Java序列化与反序列化
说明:本文为Serializable详解(1),最后两段内容在翻译上出现歧义(暂时未翻译),将在后续的Serializable(2)文中补充. 介绍:本文根据JDK英文文档翻译而成,本译文并非完全按照 ...
- Java 序列化与反序列化
Java 序列化与反序列化 文章目录 Java 序列化与反序列化 1 序列化与反序列化的概念 2 核心类与关键字总览 3 序列化与反序列化的过程 3 应用示例 4 序列化版本号的作用 serialVe ...
最新文章
- java 去掉最后一个换行符_Python 教程(一)第一个Python程序
- .net应用程序版本控制
- 赶紧3分钟学完15分钟的内容我要出去玩(8)
- php制作的ios端 跳转url,ThinkPHP 简易开发思路 MVC和URL跳转
- 第五章 shell学习之文件的排序、合并和分割
- java学习(五)包
- Ubuntu21.04设置国内镜像源
- Wordpress如何正确书写Robots.txt
- nyoj1110 一个简单数学题
- Power BI 数据分析可视化软件入门教程
- 5基于matplotlib的python数据可视化——导入Excel数据制作折线图
- BI报表工具有哪些?
- 读卡器与IC/ID卡的基本认识
- 发到微信的apk文件变成apk.1,如何安装,解决办法
- linux系统下一页,linux下一页
- java 生成拼音_java工具-常用汉语转拼音库Pinyin4j 、tinypinyin、JPinyin
- 解决一个JAVA小问题
- 亚马逊营销和运营手法的运用知多少?
- 小米电视2 android版本,小米电视2的配置参数是什么?小米电视2标配有什么?
- opencv 滤波 方框滤波 均值滤波 高斯滤波 中值滤波 双边滤波