Java 序列化接口:`Serializable`

在 Java 编程中,序列化是一种将对象状态转换为字节流的机制,以便可以将对象的状态保存到文件中或通过网络进行传输。Serializable 接口是 Java 提供的一个用于实现对象序列化的接口。本文将详细介绍 Serializable 接口的基本概念、使用方法及其在实际开发中的应用。

序列化和反序列化

序列化 是指将对象的状态转换为字节流,以便保存到磁盘或通过网络传输。

反序列化 是指将字节流重新转换为对象,以便恢复对象的状态。

Serializable 接口概述

Serializable 接口是一个标记接口(即没有任何方法),它表明一个类的对象可以被序列化。要使一个类的对象可以被序列化,该类必须实现 Serializable 接口。

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;
    }

    // Getter 和 Setter 方法
    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

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

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

在这个示例中,我们定义了一个 Person 类,并实现了 Serializable 接口。

序列化对象

要将一个对象序列化,我们可以使用 ObjectOutputStream 类。以下是一个示例,展示如何将 Person 对象序列化并保存到文件中。

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

public class SerializeExample {
    public static void main(String[] args) {
        Person person = new Person("Alice", 30);

        try (FileOutputStream fileOut = new FileOutputStream("person.ser");
             ObjectOutputStream out = new ObjectOutputStream(fileOut)) {
            out.writeObject(person);
            System.out.println("序列化对象已保存到 person.ser");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

在这个示例中,我们创建了一个 Person 对象,并使用 ObjectOutputStream 将其序列化到文件 person.ser 中。

反序列化对象

要将一个对象反序列化,我们可以使用 ObjectInputStream 类。以下是一个示例,展示如何从文件中读取 Person 对象并反序列化。

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

public class DeserializeExample {
    public static void main(String[] args) {
        try (FileInputStream fileIn = new FileInputStream("person.ser");
             ObjectInputStream in = new ObjectInputStream(fileIn)) {
            Person person = (Person) in.readObject();
            System.out.println("反序列化的对象: " + person);
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

在这个示例中,我们使用 ObjectInputStream 从文件 person.ser 中读取对象,并将其反序列化为 Person 对象。

serialVersionUID 的作用

serialVersionUID 是一个静态的、最终的 long 型字段,用于标识类的版本。在序列化和反序列化过程中,serialVersionUID 用于验证序列化的对象和反序列化的对象是否兼容。如果没有显式定义 serialVersionUID,Java 会根据类的结构自动生成一个,但强烈建议显式定义它,以避免版本不兼容问题。

private static final long serialVersionUID = 1L;
自定义序列化

有时候,我们需要自定义序列化过程,例如跳过某些字段或者执行一些特定的逻辑。可以通过实现 writeObjectreadObject 方法来实现。

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

public class CustomPerson implements Serializable {
    private static final long serialVersionUID = 1L;
    private String name;
    private transient int age; // 使用 transient 关键字,age 字段不会被序列化

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

    private void writeObject(ObjectOutputStream oos) throws IOException {
        oos.defaultWriteObject();
        oos.writeInt(age);
    }

    private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException {
        ois.defaultReadObject();
        this.age = ois.readInt();
    }

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

在这个示例中,我们通过 writeObjectreadObject 方法自定义了 CustomPerson 的序列化和反序列化过程,即使 age 字段是 transient 的,也能被序列化和反序列化。

序列化的实际应用
  1. 对象持久化:将对象的状态保存到文件中,以便在以后恢复。
  2. 网络传输:将对象通过网络发送到远程机器,常用于分布式系统。
  3. 缓存:将对象缓存到磁盘中,以提高系统性能。

总结

Serializable 接口是 Java 提供的用于实现对象序列化的强大工具。通过实现 Serializable 接口,结合 ObjectOutputStreamObjectInputStream 类,可以轻松地将对象序列化和反序列化。在实际开发中,合理使用序列化机制可以极大地提高系统的健壮性和可扩展性。掌握 Serializable 接口的使用技巧,可以更好地处理对象的持久化、网络传输和缓存需求。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基准测试程序的认知与分析 —— SPEC基准测试程序集的深入探索

基准测试程序的认知与分析 —— SPEC基准测试程序集的深入探索 一、实验目的: 了解和掌握Spec基准程序测试对基准程序测试结果进行分析和比较 二、实验准备知识: 计算机系统设计和分析的量化原则。 计算机系统设计和分析的量化原则是指导计算机系统架…

一篇就够了,为你答疑解惑:锂电池一阶模型-离线参数辨识(附代码)

锂电池一阶模型-参数离线辨识 背景模型简介数据收集1. 最大可用容量实验2. 开路电压实验3. 混合动力脉冲特性实验离线辨识对应模型对应代码总结下期预告文章字数有点多,耐心不够的谨慎点击阅读。 下期继续讲解在线参数辨识方法。 背景 最近又在开始重新梳理锂电池建模仿真与S…

【保姆级教程+配置源码】在VScode配置C/C++环境

目录 一、下载VScode 1. 在官网直接下载安装即可 2. 安装中文插件 二、下载C语言编译器MinGW-W64 三、配置编译器环境变量 1. 解压下载的压缩包,复制该文件夹下bin目录所在地址 2. 在电脑搜索环境变量并打开 3. 点击环境变量→选择系统变量里的Path→点击编…

羊了个羊:羊、羊、羊

一、I am me,羊羊羊 英文中的 我就是我(I am me),其实就是:羊 羊 羊,为什么会有这么一个结论呢? 请往下看: I,就是羊 am(是),也是羊 …

『MySQL 实战 45 讲』22 - MySQL 有哪些“饮鸩止渴”提高性能的方法?

MySQL 有哪些“饮鸩止渴”提高性能的方法? 需求:业务高峰期,生产环境的 MySQL 压力太大,没法正常响应,需要短期内、临时性地提升一些性能 短连接风暴 短连接模式:执行很少的 SQL 语句就断开,…

等保测评练习卷15

等级保护初级测评师试题15 姓名: 成绩: 判断题(10110分) 1. 防火墙应关闭不需要的系统服务、默认共享和高危端口,可以有效降低系统遭受攻击的可能性。&am…

学会整理电脑,基于小白用户(无关硬件升级)

如果你不想进行硬件升级,就要学会进行整理维护电脑 基于小白用户,每一个操作点我都会在后续整理出流程,软件推荐会选择占用小且实用的软件 主要从三个角度去讨论【如果有新的内容我会随时修改,也希望有补充告诉我,我…

【数据结构】详解二叉树之堆

失败只是暂时停止成功,假如我不能,我就一定要;假如我要,我就一定能!💓💓💓 目录 ✨说在前面 🍋知识点一:树的概念和结构 • 🌰1.什么是树&#x…

什么是自然语言处理(NLP)?详细解读文本分类、情感分析和机器翻译的核心技术

什么是自然语言处理? 自然语言处理(Natural Language Processing,简称NLP)是人工智能的一个重要分支,旨在让计算机理解、解释和生成人类的自然语言。打个比方,你和Siri对话,或使用谷歌翻译翻译一…

h5兼容table ,如何实现h5在app内使用h5渲染table表格而且实现横屏预览?

压图地址 横屏div 通过css 实现 transform: rotate(90deg); transformOrigin: 50vw 50vw ; height: 100vw; width: 100vh;<divclass"popup-box":style"{transform: originSet 0 ? rotate(90deg) : ,transformOrigin: originSet 0 ? 50vw 50vw : ,height…

正版软件 | R-Studio T80+:数据恢复与取证分析的专业之选

在数据恢复和数字取证领域&#xff0c;专业人士需要一款强大、可靠的工具来应对复杂和高要求的任务。R-Studio T80 由 R-TT 公司推出的新型许可软件&#xff0c;以其年度付费订阅模式&#xff0c;为专家提供了成本效益更高的解决方案。 全面功能&#xff0c;专业服务 R-Studio …

如何在 Linux 中后台运行进程?

一、后台进程 在后台运行进程是 Linux 系统中的常见要求。在后台运行进程允许您在进程独立运行时继续使用终端或执行其他命令。这对于长时间运行的任务或当您想要同时执行多个命令时特别有用。 在深入研究各种方法之前&#xff0c;让我们先了解一下什么是后台进程。在 Linux 中…

秋招突击——6/28、6.29——复习{数位DP——度的数量}——新作{}

文章目录 引言复习数位DP——度的数量个人实现参考实现 总结 引言 头一次产生了那么强烈的动摇&#xff0c;对于未来没有任何的感觉的&#xff0c;不知道将会往哪里走&#xff0c;不知道怎么办。可能还是因为实习吧&#xff0c;再加上最近复习也没有什么进展&#xff0c;并不知…

AI助力校园安全:EasyCVR视频智能技术在校园欺凌中的应用

一、背景分析 近年来&#xff0c;各地深入开展中小学生欺凌行为治理工作&#xff0c;但有的地方学生欺凌事件仍时有发生&#xff0c;严重损害学生身心健康&#xff0c;引发社会广泛关注。为此&#xff0c;教育部制定了《防范中小学生欺凌专项治理行动工作方案》进一步防范和遏…

2,linux服务器使用学习

目录 服务器使用-SSH 介绍 使用 OpenSSH-Linux FinalShell-Windows 阿里云服务器使用示例 领取免费账号 进行登录 服务器使用-SSH 介绍 Secure Shell(SSH) 是由 IETF(The Internet Engineering Task Force) 制定的建立在应用层基础上的安全网络协议。它是专为远程登…

拆分盘投资策略解析:机制、案例与风险考量

一、引言 随着互联网技术的迅猛发展和金融市场的不断创新&#xff0c;拆分盘这一投资模式逐渐崭露头角&#xff0c;成为投资者关注的焦点。它基于特定的拆分策略&#xff0c;通过调整投资者持有的份额和单价&#xff0c;实现了看似稳健的资产增长。本文旨在深入探讨拆分盘的运…

Meven

目录 1.简介2.Maven项目目录结构2.1 约定目录结构的意义2.2 约定大于配置 3. POM.XML介绍3.2 依赖引用3.3 属性管理 4 Maven生命周期4.1 经常遇到的生命周期4.1 全部生命周期 5.依赖范围&#xff08;Scope&#xff09;6. 依赖传递6.1 依赖冲突6.2 解决依赖冲突6.2.1 最近依赖者…

【wsl2】升级wsl及ubuntu22.04

y9kp的wsl2 还是用的自己的子网 很久没用wsl2的ubutnu22.04系统 发现无法启动 等待了挺久&#xff0c;启动了 但同时我也在升级wsl中&#xff1a; 升级wsl wsl --update 这个升级是对ubuntu22.04的运行没影响。 apt-get update 然后upgrade wsl2的升级一直在90%多不动 然…

算法 —— 双指针

目录 移动零 复写零 快乐数 盛最多水的容器 有效三角形的个数 查找总价格为目标值的两个商品 三数之和 四数之和 移动零 下图以样例1为例&#xff0c;看下图如何做到保证非零元素相对顺序前提下&#xff0c;移动零元素。 代码实现如下&#xff1a; class Solution {…

数据结构—判断题

1.数据的逻辑结构说明数据元素之间的顺序关系&#xff0c;它依赖于计算机的存储结构。 答案&#xff1a;错误 2.(neuDS)在顺序表中逻辑上相邻的元素&#xff0c;其对应的物理位置也是相邻的。 答案&#xff1a;正确 3.若一个栈的输入序列为{1, 2, 3, 4, 5}&#xff0c;则不…