个人博客 地址: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序列化与反序列化的使用的更多相关文章

  1. Java序列化与反序列化

    Java序列化与反序列化是什么?为什么需要序列化与反序列化?如何实现Java序列化与反序列化?本文围绕这些问题进行了探讨. 1.Java序列化与反序列化 Java序列化是指把Java对象转换为字节序列 ...

  2. [转] Java序列化与反序列化

    原文地址:http://blog.csdn.net/wangloveall/article/details/7992448 Java序列化与反序列化是什么?为什么需要序列化与反序列化?如何实现Java ...

  3. Java序列化与反序列化(Serializable)

    Java序列化与反序列化(Serializable) 特别注意: 1.要序列化的类必须实现Serializable借口 2.在反序列化(读取对象)的时候必须额外捕获EOFException 3.序列化 ...

  4. Java基础(五)-Java序列化与反序列化

    .output_wrapper pre code { font-family: Consolas, Inconsolata, Courier, monospace; display: block !i ...

  5. JAVA序列化和反序列化XML

    package com.lss.utils; import java.beans.XMLDecoder; import java.beans.XMLEncoder; import java.io.Bu ...

  6. Java序列化与反序列化(实践)

    Java序列化与反序列化(实践) 基本概念:序列化是将对象状态转换为可保持或传输的格式的过程.与序列化相对的是反序列化,它将流转换为对象.这两个过程结合起来,可以轻松地存储和传输数据. 昨天在一本书上 ...

  7. java序列化与反序列化(转)

    Java序列化与反序列化是什么?为什么需要序列化与反序列化?如何实现Java序列化与反序列化?本文围绕这些问题进行了探讨. 1.Java序列化与反序列化 Java序列化是指把Java对象转换为字节序列 ...

  8. Java序列化与反序列化是什么?为什么需要序列化与反序列化?如何实现Java序列化与反序列化?

    Java序列化与反序列化是什么?为什么需要序列化与反序列化?如何实现Java序列化与反序列化?本文围绕这些问题进行了探讨.  1.Java序列化与反序列化  Java序列化是指把Java对象转换为字节 ...

  9. (记录)Jedis存放对象和读取对象--Java序列化与反序列化

    一.理论分析 在学习Redis中的Jedis这一部分的时候,要使用到Protostuff(Protobuf的Java客户端)这一序列化工具.一开始看到序列化这些字眼的时候,感觉到一头雾水.于是,参考了 ...

  10. Java序列化与反序列化三连问:是什么?为什么要?如何做?

    Java序列化与反序列化是什么? Java序列化是指把Java对象转换为字节序列的过程,而Java反序列化是指把字节序列恢复为Java对象的过程: 序列化:对象序列化的最主要的用处就是在传递和保存对象 ...

随机推荐

  1. Redis实现访问控制频率

    为什么限制访问频率 做服务接口时通常需要用到请求频率限制 Rate limiting,例如限制一个用户1分钟内最多可以范围100次 主要用来保证服务性能和保护数据安全 因为如果不进行限制,服务调用者可 ...

  2. python爬虫步骤 (新手备学 )爬虫编程。

    Python爬虫是用Python编程语言实现的网络爬虫,主要用于网络数据的抓取和处理,相比于其他语言,Python是一门非常适合开发网络爬虫的编程语言,大量内置包,可以C Python爬虫可以做的事情 ...

  3. 解决在jsp页面中使用jstl无法遍历request域中list集合的问题

    解决在jsp页面中使用jstl无法遍历request域中list集合的问题 1. 前言 ​ 最近在写一个很简单的Javaweb项目,里面需要将request域中的list集合加载到jsp页面,我使用e ...

  4. linux--工具进阶

    linux学习 看完了基础篇,下面来看进阶篇 我好想哭看这的时候,好多只是听说过,但完全没有试过,感觉自己懂得有点少,就是缺乏一些知识储备,也就是必须知道了某些或学过了某些知识才适合来看这一部分,看得 ...

  5. 2019sdqdCSP-J游记

    特别鸣谢:Miku -------------------------- 中午上了车,和ljx坐在一块.太阳是多么好啊,我们在看着刚出的tg题,cmz找不到了准考证,sbl在临时打印准考证 等到好不容 ...

  6. 洛谷P1880 [NOI1995]石子合并 纪中21日c组T4 2119. 【2016-12-30普及组模拟】环状石子归并

    洛谷P1880 石子合并 纪中2119. 环状石子归并 洛谷传送门 题目描述1 在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石 ...

  7. PIE-SDK For C++矢量数据的投影转换

    1.功能简介 目前在地理信息领域中数据包括矢量和栅格两种数据组织形式,每一种数据都可以对投影进行转换,目前PIE SDK支持矢量和栅格数据的投影转换功能,下面对矢量数据的投影转换功能进行介绍. 2.功 ...

  8. PP: Unsupervised anomaly detection via variational auto-encoder for seasonal KPIs in web applications

    Problem: unsupervised anomaly detection for seasonal KPIs in web applications. Donut: an unsupervise ...

  9. 使用Docker镜像安装saltshaker

    要求 Saltstack < 2019 Python >= 3.6 Mysql >= 5.7.8 (支持Json的Mysql都可以) Redis(无版本要求) RabbitMQ (无 ...

  10. Spark学习之路 (二十八)分布式图计算系统[转]

    引言 在了解GraphX之前,需要先了解关于通用的分布式图计算框架的两个常见问题:图存储模式和图计算模式. 图存储模式 巨型图的存储总体上有边分割和点分割两种存储方式.2013年,GraphLab2. ...