【Java】对象的序列化与反序列化

2023-11-07

对象序列化的含义

对象序列化(Serialize)指将一个Java对象写入IO流中,对象的反序列化(Deserialize)则是指从IO流中恢复该Java对象。

如果想让某个Java对象能够序列化,则必须让它的类实现java.io.Serializable接口,接口定义如下:

public interface Serializable {
}

Serializable 接口是一个空接口,实现该接口无须实现任何方法,它只是告诉 JVM 该类可以被序列化机制处理。通常建议程序创建的每个 JavaBean 类都实现 Serializable。

序列化

对象序列化大致可分为两步:

  1. 创建一个对象输出流(ObjectOutputStream),可以包装一个其他类型的输出流,如文件输出流FileOutputStream。
  2. 通过对象输出流的writeObject()方法写对象,也就是输出可序列化对象。

通常,对象中的所有属性都会被序列化,但是对于一些比较敏感的信息,如用户的密码,一旦序列化后,人们完全可以通过读取文件或者拦截网络传输数据的方式获得这些信息。因此出于安全的考虑,某些属性应限制被序列化。解决的办法是使用transient来修饰。

反序列化

对象反序列化大致可分为两步:

  1. 创建一个对象输入流(ObjectInputStream),他可以包装一个其他类型的输入流,如文件输入流(FileInputStream)
  2. 通过对象输入流的readObject()方法读取对象,该方法返回一个Object类型的对象,如果程序知道该Java对象的类型,则可以将该对象强制转换成真是的类型。

​ 如果向文件中使用序列化机制写入多个对象,那么反序列化恢复对象时,必须按照写入的顺序读取。

如果一个可序列化的类,有多个父类(包括直接或间接父类),则这些父类要么是可序列化的,要么有无参构造方法,否则会抛出异常。

代码示例

  1. 学生类(Java实体类):

    package demo3.exam;
    
    import java.io.Serializable;
    
    /**
     * 可序列化 学生类
     */
    public class student implements Serializable {
        private String name;
        private String sex;
        private int age;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getSex() {
            return sex;
        }
    
        public void setSex(String sex) {
            this.sex = sex;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
        public student(String name, String sex, int age) {
            this.name = name;
            this.sex = sex;
            this.age = age;
        }
    }
    
    
  2. manager类(方法实现类):

    package demo3.exam;
    
    import demo3.Student;
    
    import java.io.*;
    import java.nio.file.Path;
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * 操作类
     */
    public class StudentManager {
        //新建列表
        List<student> stulist=new ArrayList<>();
        //初始化
        public void init(){
            student stu1=new student("哈哈哈","男",21);
            student stu2=new student("行行行","女",22);
            stulist.add(stu1);
            stulist.add(stu2);
        }
    
        
        //保存 序列化
        public void save(File path) throws IOException {
            //定义对象输出流
            ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream(path));
            //序列化
            oos.writeObject(stulist);
            oos.close();
    
        }
    
        //读取  反序列化
        public void read(File path) throws IOException, ClassNotFoundException {
            //创建对象输入流
            ObjectInputStream ois=new ObjectInputStream(new FileInputStream(path));
            //反系列化(强制类型转换)
            stulist=(ArrayList<student>)ois.readObject();
    
            ois.close();
    
        }
        //输出
        public void show(){
            for (student student : stulist) {
                System.out.println("姓名:" + student.getName()+"\t性别:"+student.getSex()+"\t年龄:"+student.getAge());
            }
        }
    }
    
    
  3. 测试类

    package demo3.exam;
    
    import java.io.File;
    import java.io.IOException;
    
    public class studentTest {
        public static void main(String[] args) throws IOException, ClassNotFoundException {
            //新建file对象
            File path=new File("c:/Users/29616/desktop/stu.txt");
    
            StudentManager manager=new StudentManager();
    
            //反序列化
           try {
               manager.read(path);
               System.out.println("读取成功");
               //输出
               manager.show();
           }catch (Exception e){
               //初始化
               manager.init();
               //序列化
               manager.save(path);
               //序列化成功
               System.out.println("序列化完成");
           }
        }
    }
    
    
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Java】对象的序列化与反序列化 的相关文章

随机推荐

  • Linux开机自启动挂盘以及进入紧急模式的解决办法

    设置开机自启动挂盘经常会有挂载错误的操作 然后就进入了紧急模式 这俩孩子老是一起出现 就一起解决了吧 1 dev sr0已经挂载好了 现在需要把它重新挂载到另一个目录 media cdrom下 2 如果需要把它挂载到另一个目录 media
  • 【华为OD机试】找出两个整数数组中同时出现的整数(C++ Python Java)2023 B卷

    时间限制 C C 1秒 其他语言 2秒 空间限制 C C 262144K 其他语言524288K 64bit IO Format lld 题目描述 现有两个整数数组 需要你找出两个数组中同时出现的整数 并按照如下要求输出 有同时出现的整数时
  • 上传文件——FormData的格式

    let fd new FormData fd append file params file 上传文件时 上传fd即可 使用场景 一般是异步上传文件 需要formdata的形式 表单元素的集合 减少元素的拼接 提高效率
  • 第 19 课时:调度器的调度流程和算法介绍(木苏)

    本文将主要分享以下四个部分的内容 调度流程 调度算法 如何配置调度器 如何扩展调度器 调度流程 调度流程概览 首先来看一下调度器流程概览图 调度器启动时会通过配置文件 File 或者是命令行参数 或者是配置好的 ConfigMap 来指定调
  • 安卓7.0 在加载某些https资源的时会出现证书验证错误OS Error(handshake.cc:)解决方案

    今天收到反馈 Flutter库 CachedNetworkImage 3 2 3 在华为早期安卓版本7 0系统中加载某些https网站的图像时会出现类似这样的错误 I flutter The following HandshakeExcep
  • 生成静态页面的五种方案 收藏

    方案1 public static bool WriteFile string strText string strContent string strAuthor string path HttpContext Current Serve
  • 【知识图谱】知识图谱数据库将人类的思维路径转化为机器的路径思维

    前段时间被沙特阿拉伯授予公民身份的人形机器人 索菲亚 再一次颠覆了人们对人工智能技术的认知 索菲亚 多次与人类交锋并公开发表言论的过程中 我们感受到了基本的对答如流 有时甚至还可以做到妙语连珠 据了解 索菲亚的大脑存储在云端 通过连接WIF
  • 处理处理kdevtmpfsi挖矿病毒以及他的守护进程kinsing

    服务器CPU资源占用一直处于100 的状态 检查发现是kdevtmpfsi占用导致的 此进程为挖矿程序 处理步骤如下 kdevtmpfsi 进程处理 1 top 查看cpu占用情况 找到占用cpu的进程 最后是 kdevtmpfsi 2 n
  • 将文件间的编译依存关系降至最低——条款31

    假设你对C 程序的某个class实现文件做了些轻微修改 注意 修改的不是class接口 而是实现 而且只改private成分 然后重新建置这个程序 并预计只花数秒就好 毕竟只有一个class被修改 你按下 Build 按钮或键入make 或
  • 西门子200SMART(六)数据块

    数据块中的数据页可以插入 编辑 删除 查询 和之前讨论的程序块 符号快以及状态图标基本具备一样的功能 数据块最主要点作用就是对地址和数据赋值 如下图 这里需要注意点是 这里的赋值和之前我们说过的状态图表中的强制是有区别的 强制顾名思义不管你
  • 【Pandas学习】读、存excel数据

    目录 一 读数据 二 将df存为excel 1 pandas DataFrame to csv 函数语法 2 利用 import os 获取保存路径 3 产生新的数据 添加至上述csv文件中已有数据的后面 4 多sheet 指定存入的she
  • Leecode 每日一题 problem2 (03-23)

    给你两个 非空 的链表 表示两个非负的整数 它们每位数字都是按照 逆序 的方式存储的 并且每个节点只能存储 一位 数字 请你将两个数相加 并以相同形式返回一个表示和的链表 你可以假设除了数字 0 之外 这两个数都不会以 0 开头 来源 力扣
  • 2021-10-24

    Python 简介 Python 是一个高层次的结合了解释性 编译性 互动性和面向对象的脚本语言 Python 的设计具有很强的可读性 相比其他语言经常使用英文关键字 其他语言的一些标点符号 它具有比其他语言更有特色语法结构 Python
  • ERR_PNPM_NO_GLOBAL_BIN_DIR Unable to find the global bin directory

    错误提示 ERROR Unable to find the global bin directory Run pnpm setup to create it automatically or set the global bin dir s
  • (1)minikube玩转k8s集群之虚拟机支持嵌套虚拟化

    配套视频教程 1 Minikube介绍 简单说 创建k8s集群很麻烦 minikube可以让我们快速搭建一个k8s集群用于学习 Minikube 是一种可以让您在本地轻松运行 Kubernetes 的工具 Minikube 在笔记本电脑上的
  • openId和unionId的区别

    网友的解释 微信的用户隐私策略 每个接入微信的应用 公众号 APP 就像一个独立的商场 用户使用这些应用就像逛商场 商场用会员卡识别用户 类似的 我们根据商场名字为每个用户生成了一张专属会员卡 openid 每张会员卡只能在对应的商场才能够
  • Navicat for MySQL安装教程

    Navicat for MySQL是一款强大的 MySQL 数据库管理和开发工具 它为专业开发者提供了一套强大的足够尖端的工具 但对于新用户仍然易于学习 Navicat for MySQL 基于Windows平台 为 MySQL 量身订作
  • R语言logistic回归的细节解读

    本文首发于公众号 医学和生信笔记 完美观看体验请至公众号查看本文 医学和生信笔记 专注R语言在临床医学中的使用 R语言数据分析和可视化 文章目录 二项logistic回归 R语言中的 factor 函数可以把变量变为因子类型 默认是没有等级
  • Redis缓存击穿问题及解决思路

    一 什么是缓存击穿 缓存击穿问题也叫热点Key问题 就是一个被高并发访问并且缓存重建业务较复杂的key突然失效了 无数的请求访问会在瞬间给数据库带来巨大的冲击 逻辑分析 假设线程1在查询缓存之后 本来应该去查询数据库 然后把这个数据重新加载
  • 【Java】对象的序列化与反序列化

    对象序列化的含义 对象序列化 Serialize 指将一个Java对象写入IO流中 对象的反序列化 Deserialize 则是指从IO流中恢复该Java对象 如果想让某个Java对象能够序列化 则必须让它的类实现java io Seria