【老白学 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…

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微调…

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 值 新建…

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

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

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

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

家教老师预约平台小程序系统开发方案

家教老师预约平台小程序系统将连接学生/家长与家教老师&#xff0c;提供一站式的家教服务预约体验。 一、用户需求分析1、家教老师&#xff1a;希望获得更多的学生资源&#xff0c;通过平台展示自己的教学特长和经验&#xff0c;管理个人日程&#xff0c;接收并确认预约请求&a…

Linux 系统安装 NCBI Blast + A Quick Guide

前言 NCBI BLAST&#xff08;Basic Local Alignment Search Tool&#xff09;是由美国国家生物技术信息中心&#xff08;NCBI&#xff09;开发的一个深受生物信息学研究者青睐的基因序列比对工具。作为生物序列信息比对的行业标准&#xff0c;BLAST可用于分析核酸&#xff08;…

嵌入式科普(26)为什么heap通常8字节对齐

目录 一、概述 二、newlibc heap 2.1 stm32cubeide .ld heap 2.2 e2studio .ld heap 三、glibc源码 3.1 Ubuntu c heap 四、总结 一、概述 结论&#xff1a;在嵌入式c语言中&#xff0c;heap通常8字节对齐 本文主要分析这个问题的分析过程 二、newlibc heap newlibc…

nginx学习之路-nginx配置https服务器

文章目录 1. 生成证书2. 配置证书1. 拷贝证书文件2. 修改conf/nginx.conf文件内容 3. 查看效果1. 重载配置2. 访问 1. 生成证书 在linux系统下执行&#xff0c;使用openssl命令。&#xff08;windows环境也可以使用cmder&#xff09; # 1. 生成私钥 server2025.key(无密码保护…

VulnHub—potato-suncs

使用命令扫描靶机ip arp-scan -l 尝试访问一下ip 发现一个大土豆没什么用 尝试扫描一下子域名 没有发现什么有用的信息 尝试扫描端口 namp -A 192.168.19.137 -p- 尝试访问一下端口,发现都访问不进去 查看源代码发现了网页的标题 potato&#xff0c;就想着爆破一下密码 hydr…

【AI部署】腾讯云每月1w小时免费GPU获取

一、如何进入活动页面 进入腾讯云官网&#xff0c;点击控制台&#xff1a; https://curl.qcloud.com/zl1rLuMf 点击工具&#xff0c;进入CloudStudio&#xff1a; 找到高性能工作空间&#xff0c;每月会有1w分钟的免费时长&#xff1a; 二、创建AI模版 点击直接创建 选择…

开源平台Kubernetes的优势是什么?

Kubernetes 是一个可移植、可扩展的开源平台&#xff0c;用于管理容器化的工作负载和服务&#xff0c;方便进行声明式配置和自动化。Kubernetes 拥有一个庞大且快速增长的生态系统&#xff0c;其服务、支持和工具的使用范围广泛。 Kubernetes 这个名字源于希腊语&#xff0c;意…

INT305 Machine Learning

W1 Introduction Nearest Neighbor Preliminaries and Nearest Neighbor Methods • Suppose we’re given a novel input vector &#x1d465; we’d like to classify. • The idea: find the nearest input vector to &#x1d465; in the training set and copy …

2025_0105_生活记录

3号去内蒙看了流星雨。还记得上次看流星的时间是2018年&#xff0c;也是冬天&#xff0c;大家在雁栖湖校区的操场上仰望星空。那个时候幸运的看到了一颗流星&#xff0c;便迅速地在心里许愿。这次看到了三颗流星&#xff0c;我也许了愿&#xff0c;希望实现。 24年走过了十多个…

Docker安装Prometheus和Grafana

概念简述 安装prometheus 第一步&#xff1a;确保安装有docker 第二步&#xff1a;拉取镜像 第三步&#xff1a;准备相关挂载目录及文件 第四步&#xff1a;启动容器 第五步&#xff1a;访问测试 安装grafana 第一步&#xff1a;确保安装有docker 第二步&#xff1a;拉…