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

  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. Iconfont技术

    什么是 IconFont 顾名思义,IconFont 就是字体图标.严格地说,就是一种字体,但是,它们不包含字母或数字,而是包含符号和字形.您可以使用 CSS 设置样式,就像设置常规文本一样,这使得 ...

  2. python递归和内置方法

    递归:函数调用自身 核心:递进的时候能够达到一个结果,问题规模越来越小(不一定要真正的达到):设置一个条件,能够让最后一次函数调用结束 练习: ​ 第一个人的姓名是16岁,后面每个人的年龄都比前一个大 ...

  3. Kubernetes安全策略

    Kubernetes CIS Benchmark 见kube-bench 1.安全策略 1.1 使用宿主节点的命名空间 命名空间分 网络命名空间 PID命名空间 IPC命名空间 Pod使用主机的网络命 ...

  4. 【转】编写高质量代码改善C#程序的157个建议——建议56:使用继承ISerializable接口更灵活地控制序列化过程

    建议56:使用继承ISerializable接口更灵活地控制序列化过程 接口ISerializable的意义在于,如果特性Serializable,以及与其像配套的OnDeserializedAttr ...

  5. 洛谷p1559运动员最佳匹配问题

    题目 搜索 可行性剪枝 虽然这题目是我搜二分图的标签搜到的 但是n比较小 明显可以暴力 然而只有80分 再加上可行性剪纸就行啦 就是记所有运动员他所能匹配到的最大值. 在我们搜索到第i层的时候 如果他 ...

  6. 洛谷 p3870 开关 线段树模板

    这两天学了很长时间于是做了一道水题 我就用了模板,就连任何优化都没有 就AC了,复杂度也很爆炸10个点1500多毫秒 这个题就是把lazy[]改成记录下修改的次数,每次修改的时候mod 2,因为反过来 ...

  7. 从零和使用mxnet实现线性回归

    1.线性回归从零实现 from mxnet import ndarray as nd import matplotlib.pyplot as plt import numpy as np import ...

  8. ZROI 暑期高端峰会 A班 Day1 组合计数

    AGC036F Square Constriants 一定有 \(l_i<p_i\le r_i\). 考虑朴素容斥,枚举每个数是 \(\le l_i\) 还是 \(\le r_i\).对于 \( ...

  9. 解决solr 请求参数过长报错too many boolean clauses Exception

    booleanClauses属性的意义 貌似是查询条件有几个逻辑判断而不是参数长度. 如下面两种情况 a:1 OR b:2 AND C:3那么此时booleanClauses=3 id(1 2 3 4 ...

  10. c#比较器辅助类

    /// <summary> /// 比较器帮助类 /// 创建人:苏本东 :: /// </summary> public class ComparerHelper<T& ...