Java基础-对象反序列化

2023-11-03

对象反序列化:

  • 使用到的流是对象字节输入流:ObjectInputStream
  • 作用:以内存为基准,把存储到磁盘文件中去的对象数据恢复成内存中的对象,称为对象反序列化

 

 

package per.mjn.serializable;

import java.io.Serializable;

/**
 * 对象要序列化,必须实现Serializable序列化接口
 */
public class Student implements Serializable {

    private String name;
    private String loginName;
    // transient修饰的成员变量不参与序列化
    private transient String password;
    private int age;

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", loginName='" + loginName + '\'' +
                ", password='" + password + '\'' +
                ", age=" + age +
                '}';
    }

    public Student() {
    }

    public Student(String name, String loginName, String password, int age) {
        this.name = name;
        this.loginName = loginName;
        this.password = password;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getLoginName() {
        return loginName;
    }

    public void setLoginName(String loginName) {
        this.loginName = loginName;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
package per.mjn.serializable;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.ObjectInputStream;

/**
 * 对象反序列化,使用对象字节输入流把文件中的对象数据恢复成内存中的Java对象
 */
public class ObjectInputStreamDemo2 {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        // 1. 创建对象字节输入流管道包装低级的字节输入流管道
        ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream("d:/obj.txt"));

        // 2. 调用对象字节输入流的反序列化方法
        Student student = (Student) inputStream.readObject();

        System.out.println(student);
    }
}

下面引入序列化版本号,如果序列化对象发生改动(序列号发生改变),此时直接反序列化会报错。

 解决方案为,重新序列化一遍,然后再反序列化。

package per.mjn.serializable;

import java.io.Serializable;

/**
 * 对象要序列化,必须实现Serializable序列化接口
 */
public class Student implements Serializable {

    // 声明序列化的版本号
    // 序列化的版本号与反序列化的版本号必须一致才不会出错!
    private static final long serialVersionUID = 2;
    private String name;
    private String loginName;
    // transient修饰的成员变量不参与序列化
    private transient String password;
    private int age;

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", loginName='" + loginName + '\'' +
                ", password='" + password + '\'' +
                ", age=" + age +
                '}';
    }

    public Student() {
    }

    public Student(String name, String loginName, String password, int age) {
        this.name = name;
        this.loginName = loginName;
        this.password = password;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getLoginName() {
        return loginName;
    }

    public void setLoginName(String loginName) {
        this.loginName = loginName;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

 

package per.mjn.serializable;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;

/**
 * 对象序列化,使用ObjectOutputStream将内存中的对象存入磁盘文件中
 * transient修饰的成员变量不参与序列化
 */
public class ObjectOutputStreamDemo1 {
    public static void main(String[] args) throws IOException {
        // 1. 创建学生对象
        Student s = new Student("mjn", "mjn", "1111", 22);

        // 2. 对象序列化,使用对象字节输出流包装字节输出流管道
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("d:/obj.txt"));

        // 3. 直接调用序列化方法
        objectOutputStream.writeObject(s);

        // 4. 释放资源
        objectOutputStream.close();
        System.out.println("序列化完成");
    }
}
package per.mjn.serializable;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.ObjectInputStream;

/**
 * 对象反序列化,使用对象字节输入流把文件中的对象数据恢复成内存中的Java对象
 */
public class ObjectInputStreamDemo2 {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        // 1. 创建对象字节输入流管道包装低级的字节输入流管道
        ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream("d:/obj.txt"));

        // 2. 调用对象字节输入流的反序列化方法
        Student student = (Student) inputStream.readObject();

        System.out.println(student);
    }
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java基础-对象反序列化 的相关文章

随机推荐

  • WPF编程,Live Charts使用说明(40)——对称行(负堆积行)

    前台 using System using System Windows Controls using LiveCharts using LiveCharts Wpf namespace Wpf CartesianChart Negativ
  • 为啥一个java文件只能有一个public类

    以后 如果有人问你为什么一个java文件只能有一个public类呢 答 很简单啊 因为public类的名字要和java文件名相同 文件名只有一个 当然只能有一个public类 问 good 那为神马文件名必须要和public类名字相同呢 不
  • Blob+定位+特征来识别药片缺陷

    原图 定位 结果 代码 This example demonstrates an application from the pharmaceutical industry The task is to check the content o
  • 【Tensorflow2.0】基于Docker的Tensorflow2.x安装教程

    文章目录 1 Docker Engine安装 1 1 填加docker ce安装源到系统 1 2 docker ce 安装 1 3 国内安装环境设置 1 3 1 docker 国内源设置 1 3 2 docker hub国内源设置 1 3
  • remote: Invalid username or password. fatal: Authentication failed for .......

    最近一直没有使用GitHub提交代码 今天提交了点东西 发现怎么都push不成功 我就纳闷了 这段时间没有做任何事情 这是怎么回事呢 我使用的sourcetree提交代码 首先它会弹出一个框框让你输入 用户名密码 然而输入了很多次 还是re
  • 达梦数据库图形化管理界面manager打开报错

    达梦数据库管理工具manager打开报如下错误 Locking is not possible in the directory home diske dmdbms tool configuration org eclipse osgi A
  • Linux基础(2)用户操作

    该文章主要为完成实训任务及总结 详细实现过程及结果见 参考文章 参考文章 https howard2005 blog csdn net article details 126843544 学习目标 用户账号管理 Linux用户操作 Linu
  • 代码覆盖率和测试覆盖率_代码覆盖率与测试覆盖率; 哪个更好?

    代码覆盖率和测试覆盖率 测试覆盖率和代码覆盖率是衡量代码有效性的最流行方法 尽管这些术语有时会互换使用 因为它们的基本原理相同 但是它们并不像您想象的那样相似 很多时候 我注意到测试团队和开发团队对这两个术语的使用感到困惑 这就是为什么我想
  • VBA中实现数组排序的多种方法

    VBA里面没有现成的Sort方法可以使用 VBA里面要对数组进行排序 现有的通常做法 1 通过单元格赋值以后利用工作表里的Sort方法进行排序 2 通过SQL实现 也需要调用单元格区域存放数据 3 直接写循环语句通过算法来实现 除了上述方法
  • require js之define 函数

    require js define 函数 模块不同于传统的脚本文件 它良好地定义了一个作用域来避免全局名称空间污染 它可以显式地列出其依赖关系 并以函数 定义此模块的那个函数 参数的形式将这些依赖进行注入 而无需引用全局变量 Require
  • C语言字节对齐及__attribute__((aligned(n))) 与 #pragma(pack(n))的作用

    一 对齐规则 在没有 attribute aligned n 或 pragma pack修饰的声明下 字节对齐遵循下面三个原则 结构体 struct 的数据成员 第一个数据成员存放的地址为结构体变量偏移量为0的地址处 结构体变量的首地址能够
  • win7防火墙规则设置

    在微软的防火墙帮助中有这么一段 在其自己唯一的 exe 文件中运行且不受服务容器主持的系统服务被视为程序 同样 作用同系统服务且无论用户是否登录到计算机都运行的程序 只要该程序在其自己唯一的 exe 文件中运行 也被视为程序 请不要在未指定
  • User Guide for AMDGPU Backend

    User Guide for AMDGPU Backend LLVM 17 0 0git documentation The AMDGPU backend provides ISA code generation for AMD GPUs
  • SAP第二代增强--出口查找(实例)以及使用

    第二代增强 增强查找 增强使用 增强查找 1 以CO02修改生产订单为例 修改好数据后 输入 H打开全局调试模式 2 回车后提示 调试被激活 3 点击保存 触发调试 并在STOP处打好断点 call customer function 4
  • Angluar初学者快速上手教程2021(理论+实例)

    文章目录 Angular 一 介绍 1 1 Angular 的概念模型 1 2 环境搭建 1 3 结构介绍 二 组件模板 2 1 JS 模板引擎的设计思路 2 2 Mustache 语法 2 3 属性绑定 2 4 事件绑定 2 5 双向绑定
  • rust官网

    https doc rust lang org std result enum Result html https doc rust lang org std option enum Option html method unwrap 学习
  • Linux查看PCIe版本及速率# lspci -vvv

    Linux查看PCIe版本及速率 https www cnblogs com lsgxeva p 9542975 html lspci vvv grep Width i lspci grep pci i00 02 0 PCI bridge
  • JAVA字符串方法

    返回特定位置的字符 String a asdf char b a charAt 2 返回 d
  • 【华为OD机试2023】产品最差奖 C++ Java Python

    华为OD机试2023 产品最差奖 C Java Python 前言 如果您在准备华为的面试 期间有想了解的可以私信我 我会尽可能帮您解答 也可以给您一些建议 本文解法非最优解 即非性能最优 不能保证通过率 Tips1 机试为ACM 模式 你
  • Java基础-对象反序列化

    对象反序列化 使用到的流是对象字节输入流 ObjectInputStream 作用 以内存为基准 把存储到磁盘文件中去的对象数据恢复成内存中的对象 称为对象反序列化 package per mjn serializable import j