序列化和反序列化的概念

  把对象转换为字节序列的过程称为对象的序列化

  把字节序列恢复为对象的过程称为对象的反序列化

  对象的序列化主要有两种用途:
  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 类

  1. package com.oukele.redis2.entity;
  2.  
  3. import java.io.Serializable;
  4.  
  5. public class Car implements Serializable {
  6.  
  7. /*
  8. * 编号
  9. */
  10. private int id;
  11. /*
  12. * 车名
  13. */
  14. private String name;
  15. /*
  16. * 车速
  17. */
  18. private double speed;
  19.  
  20. public Car(String name,double speed ){
  21. this.name = name;
  22. this.speed = speed;
  23. }
  24.  
  25. public Car(int id, String name, double speed) {
  26. this.id = id;
  27. this.name = name;
  28. this.speed = speed;
  29. }
  30.  
  31. public int getId() {
  32. return id;
  33. }
  34.  
  35. public void setId(int id) {
  36. this.id = id;
  37. }
  38.  
  39. public String getName() {
  40. return name;
  41. }
  42.  
  43. public void setName(String name) {
  44. this.name = name;
  45. }
  46.  
  47. public double getSpeed() {
  48. return speed;
  49. }
  50.  
  51. public void setSpeed(double speed) {
  52. this.speed = speed;
  53. }
  54.  
  55. @Override
  56. public String toString() {
  57. return "Car{" +
  58. "id=" + id +
  59. ", name='" + name + '\'' +
  60. ", speed=" + speed +
  61. '}';
  62. }
  63. }

新建一个 SerializeUtil 类 (封装 序列化 和 反序列化 的方法,便于调用 )

  1. package com.oukele.redis2.util;
  2.  
  3. import java.io.ByteArrayInputStream;
  4. import java.io.ByteArrayOutputStream;
  5. import java.io.ObjectInputStream;
  6. import java.io.ObjectOutputStream;
  7.  
  8. public class SerializeUtil {
  9.  
  10. /*
  11. * 序列化
  12. * */
  13. public static byte[] serialize(Object object){
  14. //序列化流 (输出流) --> 表示向一个目标 写入数据
  15. ObjectOutputStream objectOutputStream =null;
  16. //字节数组输出流
  17. ByteArrayOutputStream byteArrayOutputStream = null;
  18. try{
  19. //创建一个缓冲区
  20. byteArrayOutputStream = new ByteArrayOutputStream();
  21. //将 对象 序列化成 字节后 输入缓冲区中
  22. objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
  23. //序列化 对象
  24. objectOutputStream.writeObject(object);
  25. //得 到 序列化字节
  26. byte[] bytes = byteArrayOutputStream.toByteArray();
  27.  
  28. //清空输出流
  29. objectOutputStream.flush();
  30. //释放资源
  31. objectOutputStream.close();
  32.  
  33. return bytes;
  34. }catch (Exception e){
  35. System.out.println("出现异常:"+e.getMessage());
  36. }
  37. return null;
  38. }
  39.  
  40. /*
  41. * 反序列化
  42. * */
  43.  
  44. public static <T> T deserialize(byte[] bytes,Class<T> clazz){
  45. //字节数组
  46. ByteArrayInputStream byteArrayInputStream = null;
  47. try{
  48. //将 得到的序列化字节 丢进 缓冲区
  49. byteArrayInputStream = new ByteArrayInputStream(bytes);
  50. //反序列化流 (输入流)--> 表示着从 一个 源头 读取 数据 , (读取 缓冲区中 的字节)
  51. ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);
  52. //反序化成 一个对象
  53. return (T)objectInputStream.readObject();
  54. }catch (Exception e){
  55. System.out.println("出现异常:"+e.getMessage());
  56. }
  57. return null;
  58. }
  59.  
  60. }

测试:

  1. //序列化一个对象
  2. byte[] serialize = SerializeUitl.serialize(new Car(2,"宝马",88.8));
  3. //反序列化
  4. Car deserialize = SerializeUitl.deserialize(serialize, Car.class);
  5. System.out.println(deserialize);

测试结果:

示例源码地址: 

Java 对象序列化和反序列化 (实现 Serializable 接口)的更多相关文章

  1. java 对象序列化与反序列化

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

  2. Java对象序列化和反序列化的工具方法

    import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import ja ...

  3. Java对象序列化与反序列化一 JSON

    Java对象序列化与反序列化一 JSON 1. 依赖库 jackson-all-1.6.1.jar 2. 代码 public class Student {    private String nam ...

  4. Java 对象序列化和反序列化

         之前的文章中我们介绍过有关字节流字符流的使用,当时我们对于将一个对象输出到流中的操作,使用DataOutputStream流将该对象中的每个属性值逐个输出到流中,读出时相反.在我们看来这种行 ...

  5. Java对象序列化与反序列化

    对象序列化的目标是将对象保存在磁盘中或者在网络中进行传输.实现的机制是允许将对象转为与平台无关的二进制流. java中对象的序列化机制是将允许对象转为字节序列.这些字节序列可以使Java对象脱离程序存 ...

  6. java对象序列化、反序列化

    平时我们在Java内存中的对象,是无法进行IO操作或者网络通信的,因为在进行IO操作或者网络通信的时候,人家根本不知道内存中的对象是个什么东西,因此必须将对象以某种方式表示出来,即存储对象中的状态.一 ...

  7. JAVA对象序列化和反序列化学习

    JAVA序列化就是将JAVA对象转化为字节序列的过程,而JAVA反序列化就是将字节序列转化为JAVA对象的过程. 这一过程是通过JAVA虚拟机独立完成,所以一个对象序列化后可以在任意时间和任意机器上反 ...

  8. java对象序列化和反序列化,redis存入和获取对象

    最近使用redis发现直接存储序列化后的对象更方便,现提供java序列化和反序列化的代码 1.序列化代码: public static byte[] serialize(Object object) ...

  9. Java基础—序列化与反序列化(转载)

    转载自: Java序列化与反序列化 1.Java序列化与反序列化 Java序列化是指把Java对象转换为字节序列的过程:而Java反序列化是指把字节序列恢复为Java对象的过程. 2.为什么需要序列化 ...

随机推荐

  1. ioremap&buddy system

    生死契阔,与子成说,执子之手,与子携老 一.ioremap 1.参考: 理解 (1)http://www.linuxidc.com/Linux/2011-04/34295.htm 代码过程 (1)ht ...

  2. 结构体structure

    结构体是值类型 import Foundation struct TV{ var keyName="a" var keyNumber=9 func getKey()->Int ...

  3. Linux正则表达式结合三剑客企业级实战

    1.取系统ip 解答: 1)ifconfig ens33 |sed -n '2p'|sed "s#inet##g"|sed 's#n.*$##g'  2)ifconfig ens3 ...

  4. octave

    1. octave, 如何求一元二次方程的解: 例如:· -3x-9y=18  ·   4x+3y=12 命令: >>>  A=[-3 -9; 4 3]; B=[18;12]; &g ...

  5. 强大的strace命令用法详解

    文章转自: https://www.linuxidc.com/Linux/2018-01/150654.htm strace是什么? 按照strace官网的描述, strace是一个可用于诊断.调试和 ...

  6. 【转帖】知乎管理华为鸿蒙OS的介绍2

    作者:虎游链接:https://www.zhihu.com/question/328382980/answer/784629132来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注 ...

  7. VIM 介绍

    gedit  a.txt  是一个图形界面的文本编辑器.  需要安装图形界面才会有. nano a.txt  也是一样的 vi  是一种文本界面的编辑器. vim  是 vimsual interfa ...

  8. Spring注解Component原理源码解析

    在实际开发中,我们经常使用Spring的@Component.@Service.@Repository以及 @Controller等注解来实现bean托管给Spring容器管理.Spring是怎么样实 ...

  9. PAT A1011 World Cup Betting(20)

    AC代码 #include <cstdio> #include <algorithm> const int max_n = 3; using namespace std; /* ...

  10. Linux就该这么学——初识vim编辑器

    在Linux系统中一切都是文件,而配置一个服务就是在修改其配置文件的参数 初识Vim编辑器 Vim编辑器顾名思义就是用来编写脚本程序的”记事本” Vim编辑器模式 : 命令模式 : 控制光标移动,可对 ...