4.4. 对象序列化与反序列化

news2024/12/28 18:22:44

在本节中,我们将详细讨论Java中的对象序列化与反序列化概念、使用方法以及实例。对象序列化是将对象的状态信息转换为字节流的过程,而反序列化则相反,是将字节流恢复为对象的过程。

4.4.1 为什么需要对象序列化?

对象序列化的主要目的是为了在不同的系统间传输对象,或者将对象持久化到磁盘文件中。通过序列化和反序列化,我们可以轻松地将对象的状态信息存储到文件中或通过网络发送给其他系统,而无需关心对象内部的具体实现细节。

4.4.2 如何实现对象序列化?

要实现对象序列化,我们需要满足以下条件:

  1. 实现java.io.Serializable接口。这个接口是一个标记接口,没有任何方法,只是用来告诉Java虚拟机这个类可以被序列化。
  2. 确保类中的所有字段都是可序列化的。如果类中有不需要序列化的字段,可以使用transient关键字修饰,这样在序列化过程中这些字段将被忽略。

4.4.3 使用ObjectOutputStream和ObjectInputStream进行序列化与反序列化

Java提供了ObjectOutputStreamObjectInputStream这两个类来实现对象的序列化与反序列化。它们分别继承自OutputStreamInputStream,可以方便地将对象写入到文件或从文件中读取对象。

4.4.3.1 示例:序列化一个对象到文件

假设我们有一个Person类,需要将其对象序列化到文件中:

import java.io.Serializable;

public class Person implements Serializable {
    private static final long serialVersionUID = 1L;

    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

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

我们可以使用ObjectOutputStreamPerson对象序列化到文件:

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

public class SerializationExample {
    public static void main(String[] args) {
        try {
            FileOutputStream fos = new FileOutputStream("person.ser");
            ObjectOutputStream oos = new ObjectOutputStream(fos);

            Person person = new Person("Alice", 30);
            oos.writeObject(person);

            oos.close();
            fos.close();
            System.out.println("Person对象已序列化到文件中");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
4.4.3.2 示例:从文件中反序列化一个对象

接下来,我们可以使用ObjectInputStream从文件中反序列化Person对象:

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

public class DeserializationExample {
    public static void main(String[] args) {
        try {
            FileInputStream fis = new FileInputStream("person.ser");
            ObjectInputStream ois = new ObjectInputStream(fis);

            Person person = (Person) ois.readObject();

            ois.close();
            fis.close();
            System.out.println("从文件中反序列化Person对象:");
            System.out.println(person);
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

4.4.4 小结

通过本节的学习,我们了解了对象序列化与反序列化的概念、作用以及如何使用ObjectOutputStreamObjectInputStream进行序列化与反序列化。对象序列化是一种非常实用的技术,可以帮助我们轻松地传输对象和持久化对象状态。

请务必掌握以下重点:

  1. 对象序列化的作用:将对象的状态信息转换为字节流2. 实现对象序列化的条件:实现Serializable接口,确保类中的所有字段都是可序列化的。
  2. 使用transient关键字修饰不需要序列化的字段。
  3. 使用ObjectOutputStreamObjectInputStream进行对象的序列化与反序列化。

练习:尝试创建一个包含多个字段(例如,姓名、年龄、性别、职业等)的Person类,并进行序列化与反序列化操作。还可以尝试序列化与反序列化一个包含多个Person对象的集合,以加深理解。 推荐阅读:

https://mp.weixin.qq.com/s/dV2JzXfgjDdCmWRmE0glDA

https://mp.weixin.qq.com/s/an83QZOWXHqll3SGPYTL5g

file

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/592339.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SDN笔记

SDN是软件定义网络的简称,在SDN中,网络的控制面与数据面分离,并且通过中心控制器进行统一管理。SDN的主要目标是提高网络的灵活性、可编程性和智能化程度,从而更好地适应不断变化的业务需求。SDN可以通过控制器来管理网络设备&…

Day57【动态规划】647.回文子串、516.最长回文子序列

647.回文子串 力扣题目链接/文章讲解 视频讲解 1、确定 dp 数组下标及值含义 dp[i][j]:表示区间范围为 [i, j] 的子串是否为回文串(j > i) 这样定义才方便我们的递推!怎么想到的?回文串需要对比串的两端&#…

【大数据学习篇11】Spark项目实战~网站转化率统计

学习目标/Target 掌握广告点击流实时统计实现思路 掌握利用Kafka生产用户广告点击流数据 了解数据库设计 掌握如何创建Spark Streaming连接 掌握利用Spark Streaming读取业务数据 掌握利用Spark读取黑名单用户 掌握利用Spark Streaming过滤黑名单用户 掌握利用Spark St…

利用ArcGIS与CAD制作设计底图

准备工作: 1、需要用到的软件:ArcGIS软件、AutoCAD; 2、卫星图数据、矢量数据(因数据涉密,需要的同事请联系科技小组拷贝,并签署保密协议,严格履行保密责任)。 现在,保…

小程序开发逆势爆发,如此会无疾而终?

2019年,小程序迎来了爆发式的增长,一年时间,微信小程序的活跃用户达到了3.2亿,日活跃用户高达5.4亿,在这巨大的数据背后,是无数商家和企业的努力与付出。小程序开发的优势显而易见,不少商家和企…

for in和for of的区别

for in for in 使用于可枚举的数据 如 对象 数组 字符串 什么是可枚举的:属性的enumerable值为true,表示可枚举 可以通过es7新增的属性 Object.getOwnPropertyDescriptors()验证 查看 Object.getOwnPropertyDescriptor() 方法用于 返回 指定 对象 上一个…

kubernetes安装dashboard教程

kubernetes安装dashboard教程 前提: kubernetes集群安装完毕 安装: 1.到github获取配置文件 github下面给出方法说使用下面的直接执行就可以了,但是最近不知道为何找不到地址。 kubectl apply -f https://raw.githubusercontent.com/ku…

查看网页cookie的方法

方法一 进入目标网页后, 按F12,找到Console,在filter框内输入:document.cookie,然后回车 如果filter框内输入后下面没有显示,需要在2的位置输入document.cookie回车 其中红色的内容即为cookie内容 不过这…

如何使用OpenAI GPT-3进行自然语言生成?

自然语言生成是一项非常引人注目的技术,可以让计算机像人类一样理解、生成自然语言文本。最近,OpenAI发布了一种名为GPT-3的巨型语言模型,它是史上最强大的自然语言生成模型之一。在本文中,我将介绍如何使用GPT-3进行自然语言生成…

vue-admin-template后台管理模板在windows/linux/maxos使用

能用克隆与编译运行命令: # 克隆项目 git clone https://github.com/PanJiaChen/vue-admin-template.git# 进入项目目录 cd vue-admin-template# 安装依赖 npm install# 开发者模式运行 npm run dev 1. macos: 降级为NODEJS 16运行工程: export NODE_OPTIONS--openssl-legac…

【服务器】本地搭建PHP简单Imagewheel私人云图床

文章目录 1.前言2. Imagewheel网站搭建2.1. Imagewheel下载和安装2.2. Imagewheel网页测试2.3.cpolar的安装和注册 3.本地网页发布3.1.Cpolar临时数据隧道3.2.Cpolar稳定隧道(云端设置)3.3.Cpolar稳定隧道(本地设置) 4.公网访问测…

AndroidStudio Logcat中文乱码

1:Help-Edit Custom VM Options...,添加: -Dfile.encodingUTF-8 2:File-Settings....-Edittor-File Encodings,Global Encoding、Project Encoding设置为UTF-8 3:记得一定要重启AndroidStudio才会生效。

【Servlet编程】使用Smart Tomcat插件运行Servlet程序

前言: 大家好,我是良辰丫,在上一篇文章中我们已经学习了部署我们的第一个Servlet程序,想必大家对各个步骤已经有了一定的了解和认识,那么能不能优化一下各个步骤呢?每次打包部署有点麻烦哦!那么今天我们就来学习一个idea的插件,可以帮助我们简化我们的部署操作!!!&#x1f49e…

如何在Microsoft Excel中使用COUNTIF函数

COUNTIF 是一个 Excel 函数,用于对满足单个条件的区域中的单元格进行计数。COUNTIF可用于计算包含日期、数字和文本的单元格。COUNTIF 中使用的条件支持逻辑运算符(>、<、<>、=)和通配符(*、?)进行部分匹配。 例如,我们想计算包含 Google或 Facebook 的单元…

Android的消息机制

Android的消息机制 Android的消息机制概述 Android的消息机制主要指的是Handler的运行机制以及Handler所附带的MessageQueue和Looper的工作机制 Handler的主要作用是将一个任务切换到某个指定的线程中执行。 它的主要用处就是当要更新UI界面的时候,我们不能在非UI线程进行更…

React学习笔记九-高阶函数与函数柯里化

此文章是本人在学习React的时候&#xff0c;写下的学习笔记&#xff0c;在此纪录和分享。此为第九篇&#xff0c;主要介绍高阶函数与函数柯里化。 高阶函数&#xff0c;和函数的柯里化&#xff0c;是学习react的拓展&#xff0c;方便以后优化代码&#xff0c;更好的学习react。…

c语言编程练习题:7-115 小于m的最大的10个素数

#include <stdio.h> int is_prime(int a){for (int i2;i<a;i){if (a%i0){return 0;}}return 1; }int main(){int n;int count10;if (scanf("%d",&n)!EOF && n>50 && n<20000){// 计算150&#xff0c;分配给5&#xff0c;2&#x…

UOS桌面系统开机进入Busybox

UOS桌面系统开机进入Busybox 一、问题现象二、解决方案1、livecd工具修复a、制作livecd工具盘b、从优盘启动c、磁盘修复 2、使用fsck修复a、找出有问题的分区b、修复分区c、重启电脑 一、问题现象 开机进入如下图所示界面 问题原因&#xff1a;roota分区损坏 二、解决方案 …

MySQL — InnoDB引擎、MySQL架构、事务原理、MVCC

文章目录 InnoDB引擎一、逻辑存储架构二、架构2.1 内存结构2.1.1 Buffer Pool 缓冲池2.1.2 Change Buffer 更改缓冲区2.1.3 Log Buffer 日志缓冲区域2.1.4 Adaptive Hash Index 自适应hash索引 2.2 磁盘结构2.2.1 System Tablespace 系统表空间2.2.2 File-Per-Table Tablespace…

搭建一个vuepress静态网站及配置

搭建一个vuepress静态网站及配置 一、搭建一个vuepress网站1、创建并进入一个新目录2、初始化3、安装依赖4、创建文档5、配置启动命令及启动6、展示效果 二、配置及丰富vuepress网站1、增加配置文件2、配置侧边栏目录3、使用部分markdown语法完善页面 一、搭建一个vuepress网站…