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;}@Overridepublic 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();}@Overridepublic String toString() {return "CustomPerson{name='" + name + "', age=" + age + "}";}
}

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

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

总结

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

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

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

相关文章

你需要明白的JVM相关问题

1、说说内存溢出跟内存泄漏的区别? 内存泄露:申请的内存空间没有被正确释放,导致内存被白白占用。内存溢出:申请的内存超过了可用内存,内存不够了。可能是泄漏导致的。 2、如何判断对象仍然存活?jvm是怎么…

mysql数据库的主从复制

MySQL主从复制的应用场景 当只有一台MySQL服务器要负责读写时,对于安全性,高可用,高并发等需求就不能满足,因此就要建立集群,集群的基础就是主从复制。 原理(过程) MySQL支持的复制类型 基于语…

有关主流编程语言的几个问题及对比

参考:编程语言的历史(https://blog.csdn.net/david_lv/article/details/104765347) 静态与动态语言的优缺点分析 什么是强类型,什么是弱类型?哪种更好些?为什么? 强类型和弱类型的区别 几种常见的开发语言…

VMWare workstation虚拟机 转kvm qemu 的Qcow2格式

准备软件:VMWare Workstation软件,QEMU软件,for Windows的 https://qemu.weilnetz.de/w64/qemu-w64-setup-20240423.exe set path"C:\Program Files (x86)\VMware\VMware Workstation";%path% set diskwin2019 set diskdisk02 s…

【Kubernetes学习】

K8S基础概念一 一、k8s是什么?二、k8s功能三、k8s组件四、k8s概念总结 一、k8s是什么? kubernetes,简称k8s,是一个全新的基于容器技术的分布式架构领先方案,是谷歌严格保密十几年的秘密武器----Borg系统的一个开源版本…

kicad第三方插件安装问题

在使用KICAD时想安装扩展内容,但是遇到下载失败,因为SSL connect error。 因为是公司网络,我也不是很懂,只能另寻他法。找到如下方法可以曲线救国。 第三方插件包目录 打开存放第三方插件存放目录,用于存放下载插件包…

电子电路学习笔记(3)三极管

部分内容参考链接: 电子电路学习笔记(5)——三极管_三极管 箭头-CSDN博客 模拟电子技术基础笔记(4)——晶体三极管_集电结的单向导电性-CSDN博客 硬件基本功-36-三极管Ib电流如何控制Ic电流_哔哩哔哩_bilibili 部分…

隔离级别如何选用?

在 MySQL 中选择合适的隔离级别取决于你的应用程序对数据一致性和性能的需求。下面是 MySQL 支持的隔离级别及其适用场景: 1. 未提交读(Read Uncommitted) 描述:允许读取未提交的数据。适用场景:几乎不使用&#xff…

【JS逆向-export导出语句】将ES6模块导出语法(浏览器中)转成CommonJS格式(Node.js中)

ES6模块导出语法(浏览器中执行) // 导出 export {Jt as K, $t as a, Xt as h};// 导入 import {K as x, a as K, h as q} from "./module.js";转成CommonJS格式(Node.js中执行) // 导出 module.exports {K: Jt, a: $…

【面试系列】数据工程师高频面试题及详细解答

欢迎来到我的博客,很高兴能够在这里和您见面!欢迎订阅相关专栏: ⭐️ 全网最全IT互联网公司面试宝典:收集整理全网各大IT互联网公司技术、项目、HR面试真题. ⭐️ AIGC时代的创新与未来:详细讲解AIGC的概念、核心技术、…

LIDAR360MLS V7.2.0 雷达点云数据处理软件功能介绍

LiDAR360MLS 是三维要素智能提取及分析软件,可灵活衔接市面上主流的多型号车载、背包或手持等移动测量设备采集的激光雷达点云与影像数据。软件基于高效的海量点云数据索引结构和人工智能算法,进行点云数据编辑、提取、分析等处理及道路要素目标的三维矢…

Yarn:现代JavaScript包管理器

目录 定义与起源Yarn与NPM的比较Yarn的安装与配置安装步骤配置选项 Yarn的使用场景1. 项目初始化2. 依赖管理3. 脚本运行4. 命令总结 Yarn与其他包管理器的比较与npm的比较与pnpm的比较 结论 定义与起源 Yarn是一个现代的包管理工具,旨在提供快速、可靠和安全的依赖…

使用新H5标签dialog,实现点击按钮显示分享链接弹出层交互功能

使用新H5标签&#xff0c;实现点击按钮显示分享链接弹出层交互功能 在现代网页开发中&#xff0c;使用新技术和标签来提升用户体验是非常重要的。今天&#xff0c;我们就来聊聊如何利用HTML5的<dialog>标签来实现一个简洁实用的分享链接功能。 在过去&#xff0c;我们通常…

SpringBoot:集成机器学习模型进行预测和分析

引言 机器学习在现代应用程序中扮演着越来越重要的角色。通过集成机器学习模型&#xff0c;开发者可以实现智能预测和数据分析&#xff0c;从而提高应用程序的智能化水平。SpringBoot作为一个强大的框架&#xff0c;能够方便地集成机器学习模型&#xff0c;并提供灵活的部署和…

递推算法计算信号特征

在线算法&#xff08;在线计算或递推计算&#xff09;能够在不存储全部数据的情况下逐步更新信号的特征信息&#xff0c;非常适合资源受限的单片机应用场景。 用途&#xff1a;单片机边采集&#xff21;&#xff24;&#xff23;边计算&#xff0c;最终将采集的信号特征计算结果…

RT-Thread ENV-Windows v2.0.0安装教程

前言 前几天RT-Thread官方更新了env工具&#xff0c;开源仓库的Kconfig的写法都不大一样了&#xff1b;如果继续用原来的env工具&#xff0c;拉新代码之后很多示例都编译不了 在最新的env工具中menuconfig全面采用kconfiglib&#xff0c;升级env脚本和python版本&#xff0c;改…

Pascal 函数入门示例,及其汇编语言分析

1&#xff0c; Pascal 函数的定义格式 pascal 函数的定义语法格式: FUNCTION 函数名(形式参数表):函数类型; VAR 函数的变量说明; BEGIN 函数体; END; 2&#xff0c;Pascal 函数定义调用示例 order_self.pas 代码&#xff1a; PROGRAM example01;va…

Oracle数据库基础教程:从安装到基本操作的全面介绍

Oracle数据库基础教程&#xff1a;从安装到基本操作的全面介绍 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; Oracle数据库是全球广泛使用的关系数据库管理系…

PyTorch之nn.Module、nn.Sequential、nn.ModuleList使用详解

文章目录 1. nn.Module1.1 基本使用1.2 常用函数1.2.1 核心函数1.2.2 查看函数1.2.3 设置函数1.2.4 注册函数1.2.5 转换函数1.2.6 加载函数 2. nn.Sequential()2.1 基本定义2.2 Sequential类不同的实现2.3 nn.Sequential()的本质作用 3. nn.ModuleList参考资料 本篇文章主要介绍…

操作系统精选题(二)(综合模拟题一)

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;操作系统 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 前言 简答题 一、进程由计算和IO操作组…