【java学习—十三】处理流之六:对象流(5)

news2024/12/24 18:02:04

文章目录

  • 1. ObjectInputStream 和 OjbectOutputSteam
  • 2. 对象的序列化


假设有一个Person对象

  1. 把这个对象存到电脑的硬盘上,硬盘存储的基础是什么?(二进制)。那就需要把对象转化为一个二进制的字节流,把这个流保存到电脑上。要使用这个对象,得把流转化为对象在使用。
  2. 把这个对象通过网络传到另一个机器上,网络的通信基础是什么?(二进制)。也就是需要把一个对象转化为二进制的数据流,把这个流通过网络进行传输,在接收端如果要使用接收的对象得先把对象的流转化为对象。

正是因为①保存对象到硬盘(对象的持久化)和②对象的网络传输,需要做这两件事,就产生了对象的输入与输出

1. ObjectInputStream 和 OjbectOutputSteam

概念:用于存储和读取对象的处理流。它的强大之处就是可以把 Java 中的对象写入到数据源中,也能把对象从数据源中还原回来。
    序列化 (Serialize) :用 ObjectOutputStream 类将一个 Java 对象写入IO 流中
    反序列化 (Deserialize) :用 ObjectInputStream 类从 IO 流中恢复该 Java 对象

注意:ObjectOutputStream 和 ObjectInputStream 不能序列化 static 和 transient修饰的成员变量
序列化和反序列化针对的是对象的各种属性,不包括类的属性。

2. 对象的序列化

    对象序列化机制允许把内存中的 Java 对象转换成平台无关的二进制流,从而允许把这种二进制流持久地保存在磁盘上,或通过网络将这种二进制流传输到另一个网络节点。当其它程序获取了这种二进制流,就可以恢复成原来的 Java 对象。
    序列化的好处在于可将任何实现了 Serializable 接口的对象转化为字节数据,使其在保存和传输时可被还原
    序列化是 RMI ( Remote Method Invoke – 远程方法调用)过程的参数和返回值都必须实现的机制,而 RMI 是 JavaEE 的基础。因此序列化机制是 JavaEE 平台的基础。
    如果需要让某个对象支持序列化机制,则必须让其类是可序列化的,为了让某个类是可序列化的,该类必须实现如下两个接口之一:
     ①Serializable
     ②Externalizable

凡是实现 Serializable 接口的类都有一个表示序列化版本标识符的静态变量:
private static final long serialVersionUID;
serialVersionUID 用来表明类的不同版本间的兼容性
    如果类没有显示定义这个静态变量,它的值是 Java 运行时环境根据类的内部细节自动生成的。若类的源代码作了修改,serialVersionUID 可能发生变化。故建议,显示声明。

显示定义 serialVersionUID 的用途:
    希望类的不同版本对序列化兼容,因此需确保类的不同版本具有相同的 serialVersionUID
    不希望类的不同版本对序列化兼容,因此需确保类的不同版本具有不同的 serialVersionUID

使用对象流序列化对象

序列化
若某个类实现了 Serializable 接口,该类的对象就是可序列化的:
    ①创建一个 ObjectOutputStream
    ②调用 ObjectOutputStream 对象的 writeObject( 对象 ) 方法输出可序列化对象。注意写出一次,操作 flush()
反序列化
    ①创建一个 ObjectInputStream
    ②调用 readObject() 方法读取流中的对象
强调:如果某个类的字段不是基本数据类型或 String 类型,而是另一个引用类型,那么这个引用类型必须是可序列化的,否则拥有该类型的 Field 的类也不能序列化

举例:创建一个Person对象,对其进行序列化和反序列化

Person类:

package day13;

import java.io.Serializable;

/**
 * 序列化与反序列化的对象
 * @author 14532
 */
public class Person implements Serializable{
	
	/**
	 * 一个表示序列化版本标识符的静态变量
	 * 用来表明类的不同版本间的兼容性
	 */
	private static final long serialVersionUID = 1L;
	
	public String name;
	public int age;
}

Test.java:
(1)序列化对象

package day13;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

/**
 * 序列化与反序列化
 * @author 14532
 *
 */
public class Test5 {
	public static void main(String[] args) {
		try {
			Test5.testSerialize();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 对象的序列化
	 */
	public static void testSerialize() throws Exception{
		//定义对象的输出流,把对象的序列化之后的流放到指定的文件中
		ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("D:/java_doc/eclipse-workspace/demo/src/day13/tt9.txt"));
		
		Person p= new Person();
		p.name = "zhangsan";
		p.age = 11;
		
		out.writeObject(p);
		
		out.flush();
		out.close();
	}
	
}

运行结果:在指定路径中创建tt9.txt文件,并写入序列化后的流
在这里插入图片描述
(2)反序列化

package day13;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

/**
 * 序列化与反序列化
 * 注意:对象的序列化与反序列化使用的类要严格一致,包名、类名、类结构等等所有都要一致
 * @author 14532
 *
 */
public class Test5 {
	public static void main(String[] args) {
		try {
//			Test5.testSerialize();
			Test5.testDeserialize();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 对象的序列化
	 */
	public static void testSerialize() throws Exception{
		//定义对象的输出流,把对象的序列化之后的流放到指定的文件中
		ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("D:/java_doc/eclipse-workspace/demo/src/day13/tt9.txt"));
		
		Person p= new Person();
		p.name = "zhangsan";
		p.age = 11;
		
		out.writeObject(p);
		
		out.flush();
		out.close();
	}
	
	/**
	 * 对象的反序列化
	 */
	public static void testDeserialize() throws Exception{
		//创建对象的输入流对象,从指定的文件中把对象序列化后的流读取出来
		ObjectInputStream in = new ObjectInputStream(new FileInputStream("D:/java_doc/eclipse-workspace/demo/src/day13/tt9.txt"));
		
		Object obj = in.readObject();
		
		Person p = (Person) obj;
		
		System.out.println(p.name);
		System.out.println(p.age);
		
		in.close();
	}
	
}

运行结果:
在这里插入图片描述

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

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

相关文章

园区网络项目实战

实验背景 某写字楼备搭建一张网络供楼内企业办公使用。写字楼共6层,目前已有三层投入使用,分别 是一层会客大厅、二层行政部及总经理办公室、三层研发部和市场部。一层设有核心机房,其 他各楼层均有一个小房间放置网络设备。 第一步 询…

出入库管理系统vue2前端开发服务器地址配置

【精选】vue.config.js 的完整配置(超详细)_vue.config.js配置_web学生网页设计的博客-CSDN博客 本项目需要修改两处: 1、vue开发服务器地址:config\index.js use strict // Template version: 1.3.1 // see http://vuejs-templa…

中国1024程序员节·上海站纪实

目录 前言 活动前奏 盛大开幕 技术交流与分享 彩蛋 游戏互动环节 番外篇:上海站活动安排 结束语 前言 1024 程序员节是专属开发者的节日,他们以“码”为梦,在技术世界中“程”风破浪。作为 2023 长沙中国 1024 程序员节的重要组成部分…

系统无法访问提示“配额不足无法处理此命令“的解决思路

一些老的电脑系统会出现 电脑系统出现无法访问C:Documents and SetAdministrator桌面,配额不足。 解决思路如下 1、电脑的开始菜单的工具栏,选择运行。 2、输入栏中写入命令“gpedit.msc”。 3、弹出组策略窗口,选择打开“计算机配置”—“…

2024郑州光伏展|郑州储能展|郑州国际太阳能光伏储能展览会

2024第四届中国(郑州)太阳能光伏及储能产业展览会 时间:2024年4月8-10日 地点:郑州.中原国际博览中心 随着人们对环境保护意识的不断提高,太阳能光伏和储能技术在能源领域的应用越来越广泛。为了更好地推广和应用太…

11-8 Spring入门

把Mybatis相关的内容怎么跟service进行调用,mybatis的底层全部由spring帮我创建 把之前所有的MybatisUtil全部干掉,以及我获取对象我都不自己new了,让Spring帮我做 Spring开始1 之前学的mybatis是用于解决一层的问题(dao层&…

PDF翻页电子书制作教程,超简单噢~

PDF翻页电子书是一种可以在电脑、平板或手机上阅读的电子书,只要有网,可随时随地查看的,并且它还可以模拟真实的翻页效果,给读者展示出更好的阅读体验。那么,PDF翻页电子书如何制作呢? 其实制作这种PDF翻页…

SARAS算法

SARAS算法 代码仓库:https://github.com/daiyizheng/DL/tree/master/09-rl Sarsa算法是一种强化学习算法,用于解决马尔可夫决策过程(MDP)问题。它是一种基于值函数的方法,可以用于学习最优策略。本文将介绍Sarsa算法的流程。 S…

nginx 无法 停止

一、nginx正常停止命令 进入到nginx目录,然后执行 # 立即停止 nginx -s stop # 平滑停止 nginx -s quit 二、 如果你不小心启动了多次nginx.exe 那么通过任务管理器可以停止 三、如果 任务管理器无法停止 那么就在cmd命令中执行 netstat -ano //查看所以端口…

一文图解爬虫姊妹篇(spider)

—引导语 爬虫,没有一个时代比当前更重视它。一个好的爬虫似乎可以洞穿整个互联网,“来装满自己的胃”。 接上一篇:一文图解爬虫(spider) 博主已初步对爬虫的“五脏六腑”进行了解剖。虽然俗称“爬虫”,但窃…

【Python】Matplotlib(学习笔记)

一、Matplotlib概述 1、什么是Matplotlib 画二维图表的python库 2、Matplotlib图像结构 3、Matplotlib三层结构 容器层 > 画板层Canvas、画布层Figure、绘图区/坐标系(x、y轴张成的区域) 辅助显示层 图像层 二、基础绘图功能 1、模块导入 ma…

gin索引 btree索引 gist索引比较

创建例子数据 postgres# create table t_hash as select id,md5(id::text) from generate_series(1,5000000) as id; SELECT 5000000postgres# vacuum ANALYZE t_hash; VACUUMpostgres# \timing Timing is on. postgres# select * from t_hash limit 10;id | …

SAP 63策略测试简介

在之前的文章中我们又测试了60的策略,接下来我们测试一下63的策略,看看两者之间有什么区别。 首先我们先对比一下系统方面的配置 我们可以看到60策略和63策略中的独立需求的配置是一样的。只在客户需求配置方面有些区别,接下来就开始我们的测试 1、首先我们还是先创建物料…

K8S 集群搭建

1、搭建清单 2台linux服务器(一个master节点,一个node节点),建议搭3台(一个master,两个node) 我使用的是腾讯云,节点与节点使用公网IP通信 确保2台服务器都安装了docker 2、服务…

道路交通仿真方案【SUMO + TraCI + Python】

“城市交通模拟”(SUMO)是一个开源、高度可移植、微观和连续的交通模拟包,旨在处理大型网络(SUMO 文档)。 TraCI 是“交通控制接口”模块的简称,它可以访问正在运行的道路交通模拟,以检索模拟对…

理疗养生服务预约小程序要如何做

不少人面对身体症状疼痛,往往不会选择去医院,而是去理疗养生馆,选择艾灸、拔罐、中药贴敷等方式治疗改善或减轻疼痛。随着人们对中医信赖度增强,理疗养生市场增长迅速。 而在增长的同时,我们也注意到理疗养生馆经营痛…

点燃初冬!中海达亮相第一届中国测绘地理信息大会

11月8日,第一届中国测绘地理信息大会在浙江德清国际展览中心拉开帷幕。中海达携“海陆空、室内外”产品以及解决方案亮相展会,受到了与会领导、业界同仁、行业用户的高度关注。 ▲第一届中国测绘地理信息大会开幕式现场 本届大会以“科技引领&#xff0c…

电商平台api接口对接电商数据平台,获取商品详情页面实时信息须知

随着互联网的发展和普及,电商平台已成为人们日常生活中不可或缺的一部分。而为了保证电商平台的正常运行,平台与开发者之间需要进行数据交互,这便涉及到了电商平台API接口对接的问题。本文将详细介绍电商平台API接口对接的须知事项。 一、了解…

【原创】java+swing+mysql车辆维修管理系统设计与实现

摘要: 车辆维修管理系统是一个用于管理和追踪车辆维修过程的系统,它能够提高效率,减少错误,并提供详细的车辆历史记录,可以帮助车辆维修企业实现信息化管理,提高工作效率和客户满意度,降低运营…

RabbitMQ 核心部分之简单模式和工作模式

文章目录 一、Hello World(简单)模式1.导入依赖2.消息生产者3.消息消费者 二、Work Queues(工作)模式1.抽取工具类2.启动两个工作线程3.启动一个发送线程4.结果 总结 一、Hello World(简单)模式 在下图中&…