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对象的过程: 序列化:对象序列化的最主要的用处就是在传递和保存对象 ...
随机推荐
- 内网学习之MySQL服务提权
利用MySQL提权原理: 1.具有mysql的root权限,且mysql以system权限运行. 2.具有执行sql语句的权限,webshell或者外连皆可 UDF提权 UDF(user define ...
- win10下载
Win10 简体中文正式版 微软MSDN官方ISO镜像下载(2020年1月21日更新) 官方地址:https://www.microsoft.com/zh-cn/software-download/w ...
- Java如何优雅地使用close()?
注:本文出自博主 Chloneda:个人博客 | 博客园 | Github | Gitee | 知乎 本文源链接:https://www.cnblogs.com/chloneda/p/java-clo ...
- vue_day01
Vue_day01 1. 认识vue 1.1 什么是vue (1)Vue是构建界面的渐进式的js框架 (2)只关注视图层, 采用自底向上增量开发的设计. (3)Vue 的目标是通过尽可能简单的 API ...
- Android一个简单的自定义对话框制作
布局文件 <?xml version="1.0" encoding="utf-8"?> <TableLayout xmlns:android= ...
- 有关使用phpstudy搭建sqli-lab环境搭建时发生Uncaught Error: Call to undefined function mysql_connect()错误
文章更新于2020-1-30 问题描述 Uncaught Error: Call to undefined function mysql_connect() 分析 经查php手册可知 mysql_co ...
- 转换:使用vue-axios和vue-resource解决vue中调用网易云接口跨域的问题
本人配置成功https://segmentfault.com/a/1190000011072725
- PHP 计算当前时间是这一年的第几周
$week = intval(date('W',time()));
- function_use
# 函数说明文档,help(len) def sum1(a, b): """ 求和函数sum1 :param a: 参数1 :param b: 参数2 :return: ...
- 复习babel
对babel进行复习