【老白学 Java】保存 / 恢复对象状态

保存、恢复对象状态

码老白
文章来源:《Head First Java》修炼感悟。

上两篇文章分别讨论了对象序列化和反序列化,主要是针对数据文件进行读、写操作的介绍。 本篇文章通过一个完整的例子,复习一下对象保存与恢复的操作步骤,在文章最后做了总结。

范例:保存、恢复角色数据

以下代码模拟了一个游戏角色类,在 main 方法中新建了几个角色并初始化了原始状态,然后写入数据文件再重新读取,尝试恢复到角色的原始状态。 下面是一个完整的示例:

import java.io.*;
/*** 文件:Swordsman.java* 描述:用来演示保存与读取游戏角色的例子。*/
public class Swordsman {public static void main(String[] args) {// 新建三个游戏角色Hero one = new Hero(50, "精灵", new String[] {"弓", "剑"});Hero two = new Hero(200, "侏儒", new String[] {"空手", "巨斧"});Hero three = new Hero(120, "魔法师", new String[] {"符咒", "隐身"});// 尝试写入角色数据try {FileOutputStream fs = new FileOutputStream("game.ser");ObjectOutputStream os = new ObjectOutputStream(fs);os.writeObject(one);os.writeObject(two);os.writeObject(three);os.close();} catch (IOException e) {e.printStackTrace();}// 释放堆中角色对象占用的空间one = null;two = null;three = null;// 尝试读取角色数据try {FileInputStream fs2 = new FileInputStream("game.ser");ObjectInputStream os2 = new ObjectInputStream(fs2);// 角色对象类型转换Hero heroOne = (Hero) os2.readObject();Hero heroTwo = (Hero) os2.readObject();Hero heroThree = (Hero) os2.readObject();// 输出角色信息System.out.println("角色1职业: " + heroOne.getType());System.out.println("角色2职业: " + heroTwo.getType());System.out.println("角色3职业: " + heroThree.getType());} catch (Exception ex) {ex.printStackTrace();}}
}// 角色类,为了可以序列化实现了 Serializable 接口
class Hero implements Serializable {// 角色属性int power;				// 力量String type;			// 职业String[] weapons;		// 武器// 构造方法,用于初始化角色属性public Hero(int p, String t, String[] ws) {power = p;type = t;weapons = ws;}// 返回力量值public int getPower() {return power;}// 返回职业类型public String getType() {return type;}// 返回武器装备public String getWeapons() {String weaponList = "";for (int i = 0; i < weapons.length; i++) {weaponList += weapons[i] + " ";}return weaponList;}
}

编译、执行结果:
保存恢复对象
成功地恢复到了角色创建时的状态。

重点回顾

  • 通过序列化操作可以保存对象当前状态;
  • ObjectOutputStream.writeObject(obj) 可以写入对象序列化数据;
  • ObjectOutputStream 连接 FileOutputStream 传递序列化数据;
  • FileOutputStream 把序列化数据写入文件;
  • 序列化对象必须实现 Serializable 接口,若父类已实现,子类无需重复实现;
  • 对象序列化时,所有实例变量引用的对象都会被序列化;
  • 如果有不能序列化的对象会抛出异常;
  • 除非实例变量被修饰为 transient,否则会被赋值 null、0、0.0 或者 false;
  • 反序列化时,如果 Java 虚拟机没有找到合适的类就会抛出异常;
  • 从数据文件中读取对象信息时,必须与保存时的顺序一致;
  • 恢复对象后的类型为 Object,需要强制转换为原始类型;
  • 静态变量不会被序列化,因为它是所有对象共享的。


《 上一篇 对象反序列化下一篇 写入 / 读取文本数据 》

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

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

相关文章

进程间通信——网络通信——UDP

进程间通信&#xff08;分类&#xff09;&#xff1a;网络通信、无名管道、有名管道、信号、消息队列、共享内存、信号量集 OSI七层模型&#xff1a;&#xff08;理论模型&#xff09; 应用层 : 要传输的数据信息&#xff0c;如文件传输&#xff0c;电子邮件等 表示层 : 数…

3272 小蓝的漆房

将devc设置支持编译就能用新的遍历方式 for(auto &x : s)//遍历容器s&#xff0c;变量为x /* 多循环的嵌套&#xff1a; 计数是否需要重置为0; 是否因为ans定义成全局变量导致ans在比较多时候会出现错误*/ /* 1.对于一个标准色&#xff0c;对目标数组遍历&#xff0c; 如…

海外云服务器能用来做什么?

海外云服务器不仅服务种类繁多&#xff0c;而且能满足多行业的需求&#xff0c;方便了越来越多的企业与个人。本文将探讨海外云服务器的核心服务及其适用领域&#xff0c;帮助企业更好地了解这一技术资源。 云存储&#xff1a;安全高效的数据管理 海外云服务器为用户提供了稳定…

导出中心设计

业务背景 应用业务经常需要导出数据&#xff0c;但是并发的导出以及不合理的导出参数常常导致应用服务的内存溢出、其他依赖应用的崩溃、导出失败&#xff1b;因此才有导出中心的设计 设计思想 将导出应用所需的内存转移至导出中心&#xff0c;将导出的条数加以限制&#xf…

智能工厂的设计软件 应用场景的一个例子: 为AI聊天工具添加一个知识系统 之23 “单子”职业能力原型:PIN语言/AI操作系统/robot扮演的actor

本文提要 很重要的一点是&#xff0c;PIN语言的每个 “词项”&#xff08;最小表达单子&#xff09; 唯一地提供本项目模板的一个“ 槽”位--占位符变量。这样确定了 本项目的“祖传代码” 的脚本模板了 我前面已经为三套文 给出了 对应的三套模板的名称和用意了--”在本项目的…

Re77 读论文:LoRA: Low-Rank Adaptation of Large Language Models

诸神缄默不语-个人CSDN博文目录 诸神缄默不语的论文阅读笔记和分类 论文全名&#xff1a;LoRA: Low-Rank Adaptation of Large Language Models ArXiv网址&#xff1a;https://arxiv.org/abs/2106.09685 官方GitHub网站&#xff08;包含在RoBERTa、DeBERTa、GPT-2上用Lora微调…

Vue3苦逼的学习之路

从一名测试转战到全栈是否可以自学做到&#xff0c;很多朋友肯定会说不可能&#xff0c;或就算转了也是个一般水平&#xff0c;我很认同&#xff0c;毕竟没有经过各种项目的摧残&#xff0c;但是还是得踏足一下这个领域。所以今天和大家分享vue3中的相关内容&#xff0c;大佬勿…

C++单例模式跨DLL调用问题梳理

问题案例&#xff1a; 假设有这样一个单例模式的代码 //test.h header class Test { public:static Test &instance() {static Test ins;return ins;}void foo(); };void testFoo();//test.cpp source #include "test.h"void Test::foo() {printf("%p\n&q…

ESP32-S3系统级芯片支持烧录的编程语言

ESP32-S3作为一款功能强大的MCU系统级芯片&#xff0c;支持多种编程语言的烧录和开发。以下是对ESP32-S3支持的主要编程语言的详细介绍&#xff1a; 一、C/C ESP-IDF框架&#xff1a;ESP32-S3支持使用乐鑫官方的ESP-IDF&#xff08;Espressif IoT Development Framework&…

Redis 数据库源码分析

Redis 数据库源码分析 我们都知道Redis是一个 <key,value> 的键值数据库&#xff0c;其实也就是一个 Map。如果让我来实现这样一个 Map&#xff0c;我肯定是用数组&#xff0c;当一个 key 来的时候&#xff0c;首先进行 hash 运算&#xff0c;接着对数据的 length 取余&…

我的nvim的init.lua配置

nvim的配置文件路径在&#xff5e;/.config/nvim路径下&#xff1a; 一、目录如下&#xff1a; coc-settings.json文件是配置代码片段路径的文件init.lua配置文件的启动脚本lua/config.lua 全局配置文件lua/keymaps.lua 快捷键映射键文件lua/plugins.lua 插件的安装和配置文件…

权限掩码umask

1 、 设置新建文件或目录的默认权限 在 Linux 系统中&#xff0c;当用户创建一个新的文件或目录时&#xff0c;系统都会为新建的文件或目录分配默认的权限&#xff0c;该默认权限与umask 值有关&#xff0c;其具体关系是&#xff1a; 新建文件的默认权限 0666-umask 值 新建…

Kubernetes Gateway API-5-后端协议和网关基础设置标签

1 后端协议 自 v1.2.0 开始支持 并非所有网关API实现都支持自动协议选择。在某些情况下&#xff0c;协议在没有明确选择加入的情况下被禁用。 当 Route 的后端引用Kubernetes Service 时&#xff0c;应用程序开发人员可以使用 ServicePort appProtocol 字段指定协议。 例如…

C++语言的网络编程

C语言的网络编程 引言 随着互联网的迅猛发展&#xff0c;网络编程已成为软件开发的重要组成部分。C作为一种高效的编程语言&#xff0c;因其出色的性能和灵活性&#xff0c;广泛应用于网络编程领域。本文将介绍C网络编程的基本概念、常用的网络库&#xff0c;以及一些具体的应…

考试座位号(PTA)C语言

每个 PAT 考生在参加考试时都会被分配两个座位号&#xff0c;一个是试机座位&#xff0c;一个是考试座位。正常情况下&#xff0c;考生在入场时先得到试机座位号码&#xff0c;入座进入试机状态后&#xff0c;系统会显示该考生的考试座位号码&#xff0c;考试时考生需要换到考试…

宝安湾区之光附近的钓鱼点

工作日的午休我经常在公司附近骑行&#xff0c;有时候也会骑行到宝安的湾区之光。但是我最感兴趣的除了湾区之光摩天轮&#xff0c;还有雷打不动的快乐钓鱼佬。 上图红框区域的河岸每天都会出现零零散散的快乐钓鱼佬&#xff0c;他们好像都有自己的钓鱼窝点。我发现来这里钓鱼也…

GNU链接器简介-3

GNU链接器简介-3 1 SECTIONS Command1.1 Output Section Description2.2 Output Section Name1.3 Output Section Address1.4 Input Section Description1.4.1 Input Section Basics1.4.2 Input Section Wildcard Patterns1.4.3 Input Section for Common Symbols1.4.4 Input S…

【练习】PAT 乙 1022 D进制的A+B

题目 输入两个非负10进制整数A和B(<2^30-1)&#xff0c;输出AB的D (1 < D < 10)进制数。 输入格式 输入在一行中依次给出3个整数A、B和D。 输出格式 输出AB的D进制数。 输入样例 123 456 8 输出样例 1103 来源&#xff1a;PAT 乙 1022 D进制的AB ——————————…

音视频-----RTSP协议 音视频编解码

流媒体协议详解&#xff1a;RTSP、RTP、RTCP、SIP、SDP、RTMP、WebRTC、WebSocket-CSDN博客 上文讲解比较清楚 多媒体编解码基础知识 一文详解WebRTC、RTSP、RTMP、SRT-腾讯云开发者社区-腾讯云 流媒体协议简介 &#xff08;整理&总结&#xff09;-CSDN博客 RTP :(Real-…

实时数仓与离线数仓的全面对比

在大数据和数据仓库的领域&#xff0c;实时数仓和离线数仓是两种常见的架构。它们分别适用于不同的业务场景&#xff0c;具有不同的技术特点、实现方式和使用场景。 下面将从底层原理、架构、技术实现、数据处理方式等多个方面对这两者进行详细对比。 1. 基本定义 实时数仓&…