一.序列化和反序列化介绍

  1. 什么是序列化和反序列化?

    ​ 序列化就是将对象转换为字节序列的过程。

    ​ 反序列化就是将字节序列恢复为对象的过程。

  2. 序列化的用途在哪?

    通常情况下,序列化有两个用途:

    • 将对象的字节序列永久的保存到硬盘上,一般存在一个文件中。
    • 在网络中传送对象的字节序列。
  3. 序列化的意义?

    序列化机制使得对象可以脱离程序的运行而独立存在,能够离开内存空间,以便能长期保存。

    比如:一个记录用户信息设置的类,当程序退出后下次再运行要保留上次的信息设置,此时就可以把这个类作为配置文件存在磁盘上,每次运行时再读取。

二.序列化和反序列化要点

  1. 序列化接口(Serializable

    要序列化的对象必须实现Serializable接口,否则将出现异常NotSerializableException,无法序列化

  2. transient关键字

    注意并不是所有的元素都需要序列化,当某些元素不需要序列化时,可以使用transient关键字修饰,被transient修饰的元素,不会进行jvm默认的序列化。

  3. jvm是否允许反序列化,不仅与类的路径和功能代码是否一致相关,更重要的是类的序列化ID是否一致,也就是private static final long serialVersionUID

    序列化ID有两种生成策略:一种是固定的1L,一种是随机生成一个不重复的long类型数据;

    建议是:没有特殊需求就使用默认的1L。

  4. 序列化不保存静态变量。

    因为序列化保存的是对象的状态,静态变量是属于类的状态的,因此序列化不会保存静态变量。

这篇文章讲的比较清晰,个人觉得不错:[Java 序列化的高级认识(转载)]

三.序列化和反序列化使用

  1. 序列化的实现方式:java.io.ObjectOutputStream类,继承自OutputStream,将Java对象的原始数据类型写到文件,实现对象的持久化存储。

    • 构造方法:

      ObjectOutputStream(OutputStream out):创建写入指定 OutputStream 的 ObjectOutputStream

    • 序列化写出对象方法:

      public final void writeObject(Object obj):将指定的对象写入 ObjectOutputStream。

    • 序列化操作步骤:

      • 创建一个ObjectOutputStream输出流。
      • 调用ObjectOutputStream对象的writeObject输出可序列化对象。

    示例:

    import java.io.Serializable;
    
    public class Person implements Serializable{
    public static final long serialVersionUID = 1L;
    public String name;
    public int age; public Person(String name, int age) {
    this.name = name;
    this.age = age;
    }
    }
    import java.io.*;
    
    public class TestObjectOutputStream {
    public static void main(String[] args) throws IOException {
    ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("object.txt"));
    Person p = new Person("zhangsan", 20);
    Person p1 = new Person("lisi", 30); oos.writeObject(p);
    oos.writeObject(p1); oos.close();
    }
    }
  2. 反序列化的实现方式:java.io.ObjectInputStream类,继承自InputStream,将之前使用ObjectOutputStream序列化的原始数据恢复为对象 。

    • 构造方法:

      ObjectInputStream(InputStream in):创建从指定InputStream读取的ObjectInputStream。

    • 反序列化读出对象方法:

      public final Object readObject(): 从 ObjectInputStream 读取对象。

    • 反序列化操作步骤:

      • 创建一个ObjectInputStream输入流。
      • 调用ObjectInputStream对象的readObject()得到序列化的对象。

    示例1:读取上面序列化的Person实例化对象

    import java.io.*;
    
    public class TestObjectInputStream {
    public static void main(String[] args) throws IOException,ClassNotFoundException{
    ObjectInputStream ois = new ObjectInputStream(new FileInputStream("object.txt")); // 按写入的顺序读出
    Person p = (Person)ois.readObject();
    Person p1 = (Person)ois.readObject(); System.out.println("name:" + p.name + ",age:" + p.age);
    System.out.println("name:" + p1.name + ",age:" + p1.age);
    ois.close();
    }
    }

    说明:

    1. 对于反序列化,在反序列化对象时候,必须是能够找到对应的class文件的类才行,如果找不到该类的class文件,则会抛出一个ClassNotFoundException

    2. 反序列化还可能出现另一个异常:InvalidClassException

      可能的原因有以下几点:

      • 该类的序列化ID与从流中读出来的序列化ID不一致(使用serialVersionUID解决)
      • 该类含有未知数据类型
      • 该类没有可访问的无参构造方法。

Java IO---序列化和反序列化的更多相关文章

  1. Java之序列化和反序列化

    序列化的对象: package test_demo.SerializableOper; import java.io.Serializable; /* * 序列化对象需要实现序列号接口 * */ pu ...

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

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

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

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

  4. java之序列化与反序列化

    1.这里主要是介绍Protobuf提供的序列化与反序列化的高效性.相对于传统的java提供的序列化来说,Protobuf的效率提高了很多倍.但是也有不足的地方,就是proto在对象序列化的时候抛弃了很 ...

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

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

  6. Java 中序列化与反序列化

    一. 序列化和反序列化概念 Serialization(序列化)是一种将对象以一连串的字节描述的过程:反序列化deserialization是一种将这些字节重建成一个对象的过程.将程序中的对象,放入文 ...

  7. Java IO: 序列化与ObjectInputStream、ObjectOutputStream

    作者:Jakob Jenkov  译者: 李璟(jlee381344197@gmail.com) 本小节会简要概括Java IO中的序列化以及涉及到的流,主要包括ObjectInputStream和O ...

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

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

  9. java IO 对象流 反序列化和序列化

    例: 重点:需要序列化的对象必须实现Serializable接口 //需要序列化的对象 public class User implements Serializable { private Stri ...

  10. JAVA IO 序列化与设计模式

    ➠更多技术干货请戳:听云博客 序列化 什么是序列化 序列化:保存对象的状态 反序列化:读取保存对象的状态 序列化和序列化是Java提供的一种保存恢复对象状态的机制 序列化有什么用 将数据保存到文件或数 ...

随机推荐

  1. [51nod1227]平均最小公倍数(莫比乌斯反演+杜教筛)

    题意 求 $\sum_{i=a}^b \sum_{j=1}^i \frac{lcm(i,j)}{i}$. 分析 只需要求出前缀和, $$\begin{aligned}\sum_{i=1}^n \sum ...

  2. tornado表单和模板

    模板渲染,指定模板路径: app = tornado.web.Application( handlers=[(r'/my', Myrequest),('/myweb',MywebRequest)], ...

  3. STL 二分查找

    实现源码:https://www.cnblogs.com/cobbliu/archive/2012/05/21/2512249.html 1.在一个递增的数组(或vector)中查找元素属于[ s , ...

  4. GCD(洛谷 2568)

    题目描述 给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的数对(x,y)有多少对. 输入格式 一个整数N 输出格式 答案 输入输出样例 输入 #1 4 输出 #1 4 说明/提示 ...

  5. spring cloud 服务链路追踪 skywalking 6.1

    随着微服务架构的流行,服务按照不同的维度进行拆分,一次请求往往需要涉及到多个服务.互联网应用构建在不同的软件模块集上,这些软件模块,有可能是由不同的团队开发.可能使用不同的编程语言来实现.有可能布在了 ...

  6. Golang(六)time 包的用法整理

    1. 常用结构体 Duration:type Duration int64,时间长度,对应单位包括 Nanosecond(纳秒).Microsecond(微妙).Millisecond(毫秒).Sec ...

  7. Allowed memory size of 134217728 bytes exhausted问题解决方法

    Allowed memory size of 134217728 bytes exhausted问题解决方法 php默认内存限制是128M,所以需要修改php.ini文件. 查找到memory_lim ...

  8. linux_problem

    今日自学遇到两个问题:火狐浏览器显示安全错误,按照国内网站上抄来抄去的解决办法并没有解决我的问题,即,每次访问新的网站都会提示"support mozilla.org 的管理员...&quo ...

  9. 以前写的canvas 小游戏 贪吃蛇代码

    效果如图,完成了贪吃蛇的基本的功能 代码地址 :https://github.com/my-new-git-hub/canvasSnake.git 预览地址:https://www.kzc275.to ...

  10. SpringBoot系列教程web篇Servlet 注册的四种姿势

    原文: 191122-SpringBoot系列教程web篇Servlet 注册的四种姿势 前面介绍了 java web 三要素中 filter 的使用指南与常见的易错事项,接下来我们来看一下 Serv ...