java序列化与反序列化的使用
个人博客 地址:http://www.wenhaofan.com/article/20180925214701
1、什么是序列化和反序列化
Serialization(序列化)是一种将对象以一连串的字节描述的过程;反序列化deserialization(反序列化)是一种将这些字节重建成一个对象的过程。
说通俗一点:
序列化就是将java中的对象(其中包含对象的信息),以文件的信息保存下来。
反序列化就是将反序列化的文件的信息读取出来,并转换为一个对象。
2、什么情况下需要序列化
a)当你想把的内存中的对象保存到一个文件中或者数据库中时候;
b)当你想用套接字在网络上传送对象的时候;
c)当你想通过RMI传输对象的时候;
3、如何让对象能够被序列化
将需要序列化的类实现Serializable接口即可,Serializable接口中没有任何方法,可以理解为一个标记,即表明这个类可以序列化。
4、序列化和反序列化例子
序列化:当我们想要序列化一个对象,首先要创建一个OutputStream(例如FileOutputStream、ByteArrayOutputStream等字节流,对象的序列化是基于字节的,不能使用例如Reader以及Writer等基于字符流的层级结构),然后将这些OutputStream封装在一个ObjectOutputStream中。这时候,只需要调用writeObject()方法就可以将对象序列化,也就是会生成一个文件。
反序列化:当我们需要将一个序列化之后的文件反序列化为一个对象,首先要创建一个InputStream(例如FileOutputStream、ByteArrayOutputStream等字节流,理由同上)获得生成后的序列化文件的流,然后将其封装进 ObjectInputStream。这时候,只需要调用readObject();方法,该方法会返回一个为Object类型的对象,该对象就是通过序列化文本生成的对象。
代码如下:
package Serializable; import java.io.Serializable; /** * 测试中需要用来序列化的类 * @author fwh * */ public class Person implements Serializable{ /** * serialVersionUID * java的序列化机制是通过判断类的serialVersionUID来验证版本一致性的。 * 在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本地相应实体类的serialVersionUID进行比较,如果相同就认为是一致的, * 可以进行反序列化,否则就会出现序列化版本不一致的异常,即是InvalidCastException。 * 也就是说serialVersionUID可以设定为任意一个类型为long的值, * 于此同时接收反序列化的对象的类中的serialVersionUID也必须与序列化的类中的serialVersionUID一致,否则就会出错 * */ private static final long serialVersionUID = 1L; String name="张三1"; public String getName() { return name; } public void setName(String name) { this.name = name; } public static long getSerialversionuid() { return serialVersionUID; } @Override public String toString() { return "Person [name=" + name + "]"; } }
实现序列化以及反序列化:
package Serializable; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; /** * 测试序列化以及反序列化 * @author fwh * */ public class Main{ public static void main(String[] args) { Person person=new Person(); person.setName("李四"); //调用本类中执行序列化的方法将person对象序列化 serializable(person); System.out.println("这是序列化之前的对象:"+person); //调用本类中执行反序列化的方法获得我们之前序列化的person对象 FileInputStream fis = null; try { fis = new FileInputStream("obj.out"); //因为返回值为Object所以需要强转 Person p=(Person) deserialization(fis); //输出获得到的 System.out.println("这是通过反序列化得到的对象:"+p); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ //如果字节流不为空则关闭 if(fis!=null){ try { fis.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } /** * 执行序列化的方法 */ public static void serializable(Object obj){ FileOutputStream fos=null; ObjectOutputStream oos = null; try { //序列化只能使用字节流,对象的序列化是基于字节的,不能使用Reader和Writer等字符流 fos = new FileOutputStream("obj.out"); //将输出流封装进使用ObjectOutputStream输出至本地 oos=new ObjectOutputStream(fos); oos.writeObject(obj); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ //如果不为空则刷新执行序列化功能的输出流 if(oos!=null){ try { oos.flush(); oos.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } /** * 执行反序列化的方法 * @param fis 包含文件信息路径的字节输入流 * @return 通过反序列化得到的对象 */ public static Object deserialization(FileInputStream fis){ ObjectInputStream ois = null; Object obj=null; try { //反序列化只能使用字节流,对象的序列化是基于字节的,不能使用Reader和Writer等字符流 ois = new ObjectInputStream(fis); obj=ois.readObject(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ //如果流不为空,则关闭 if(ois!=null){ try { ois.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } return obj; } }
java序列化与反序列化的使用的更多相关文章
- Java序列化与反序列化
Java序列化与反序列化是什么?为什么需要序列化与反序列化?如何实现Java序列化与反序列化?本文围绕这些问题进行了探讨. 1.Java序列化与反序列化 Java序列化是指把Java对象转换为字节序列 ...
- [转] Java序列化与反序列化
原文地址:http://blog.csdn.net/wangloveall/article/details/7992448 Java序列化与反序列化是什么?为什么需要序列化与反序列化?如何实现Java ...
- Java序列化与反序列化(Serializable)
Java序列化与反序列化(Serializable) 特别注意: 1.要序列化的类必须实现Serializable借口 2.在反序列化(读取对象)的时候必须额外捕获EOFException 3.序列化 ...
- Java基础(五)-Java序列化与反序列化
.output_wrapper pre code { font-family: Consolas, Inconsolata, Courier, monospace; display: block !i ...
- JAVA序列化和反序列化XML
package com.lss.utils; import java.beans.XMLDecoder; import java.beans.XMLEncoder; import java.io.Bu ...
- Java序列化与反序列化(实践)
Java序列化与反序列化(实践) 基本概念:序列化是将对象状态转换为可保持或传输的格式的过程.与序列化相对的是反序列化,它将流转换为对象.这两个过程结合起来,可以轻松地存储和传输数据. 昨天在一本书上 ...
- java序列化与反序列化(转)
Java序列化与反序列化是什么?为什么需要序列化与反序列化?如何实现Java序列化与反序列化?本文围绕这些问题进行了探讨. 1.Java序列化与反序列化 Java序列化是指把Java对象转换为字节序列 ...
- Java序列化与反序列化是什么?为什么需要序列化与反序列化?如何实现Java序列化与反序列化?
Java序列化与反序列化是什么?为什么需要序列化与反序列化?如何实现Java序列化与反序列化?本文围绕这些问题进行了探讨. 1.Java序列化与反序列化 Java序列化是指把Java对象转换为字节 ...
- (记录)Jedis存放对象和读取对象--Java序列化与反序列化
一.理论分析 在学习Redis中的Jedis这一部分的时候,要使用到Protostuff(Protobuf的Java客户端)这一序列化工具.一开始看到序列化这些字眼的时候,感觉到一头雾水.于是,参考了 ...
- Java序列化与反序列化三连问:是什么?为什么要?如何做?
Java序列化与反序列化是什么? Java序列化是指把Java对象转换为字节序列的过程,而Java反序列化是指把字节序列恢复为Java对象的过程: 序列化:对象序列化的最主要的用处就是在传递和保存对象 ...
随机推荐
- C#实现的一些常见时间格式
string aa = DateTime.Now.ToShortDateString();//"2019/9/23" string bb = DateTime.Now.ToShor ...
- Vue 实现动态路由及登录&404页面跳转控制&页面刷新空白解决方案
Vue实现动态路由及登录&404页面跳转控制&页面刷新空白解决方案 by:授客 QQ:1033553122 开发环境 Win 10 Vue 2.9.6 node-v ...
- win10系统vscode c/c++配置环境
使用vscode可以完成轻量级的编译器环境搭建,使用vscode 搭建完整的c++开发环境见下网站: https://www.bilibili.com/video/av18436497/?spm_id ...
- P1149 火柴棒等式(打表初尝试)
题目描述 给你 n 根火柴棍,你可以拼出多少个形如 “A+B=CA+B=C” 的等式?等式中的 A.B.C 是用火柴棍拼出的整数(若该数非零,则最高位不能是 0).用火柴棍拼数字 0−9 的拼法如图所 ...
- GitHook 工具 —— husky介绍及使用
名称 githooks-Git使用的挂钩.(githook在官网的介绍) 描述 如同其他许多的版本控制系统一样,Git 也具有在特定事件发生之前或之后执行特定脚本代码功能(从概念上类比,就与监听事件. ...
- Kemaswill 机器学习 数据挖掘 推荐系统 Python optparser模块简介
Python optparser模块简介
- Jacoco收集单元测试、集成测试和系统功能测试覆盖率
Jacoco收集单元测试.集成测试和系统功能测试覆盖率 2020-02-27 目录 1 安装版本2 被测系统代码示例3 收集单元测试覆盖率4 收集集成和功能测试覆盖率 代码覆盖率可在单元测试.系统测 ...
- UVA1349(带权二分图最大匹配 --> KM算法模板)
UVA1349 题意:给定一些有向带权边,求出把这些边构造成一个个环,总权值最小 解法: 对于带权的二分图的匹配问题可以用通过KM算法求解. 要求最大权匹配就是初始化g[i][j]为0,直接跑就可以: ...
- Java数列循环左移
描述 有n个整数组成一个数组(数列).现使数列中各数顺序依次向左移动k个位置,移出的数再从尾部移入.输出移动后的数列元素. 题目没有告诉你n的范围,要求不要提前定义数组的大小. 另外要求定义并使用函数 ...
- node种buffer对象数组 深拷贝浅拷贝问题
node的一个上位机和下位机通信的转发程序,用的是udp转发. 其中在发送的时候会进行一次rc4加密数据 出现问题就在这个加密数据这一块,因为这个是升级包广播发送.提前生成了升级用的广播报文,是一个b ...