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

文章目录

  • 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();
	}
	
}

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

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

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

相关文章

windows找不到文件xxxx\bin\startup.bat ,tomcat无法启动

问题现象: 问题背景:这是一个神经病的问题,开始tomcat是启动的,结果我的网络一直连接不上,然后检查发现网络适配器以及网线连接都没有问题,于是就按照我以往一贯处理方式:重启电脑,结…

【工具使用】STM32CubeMX-定时器PWM配置

一、概述 无论是新手还是大佬,基于STM32单片机的开发,使用STM32CubeMX都是可以极大提升开发效率的,并且其界面化的开发,也大大降低了新手对STM32单片机的开发门槛。     本文主要讲述STM32芯片定时器PWM功能的配置及其相关知识…

Word2Vec浅谈

论文地址:Efficient Estimation of Word Representations in Vector Space word2vec是Google团队在2013年发表的一篇paper,当时一经问世直接将NLP领域带到了一个新的高度,在2018年bert被提出之前,word2vec一直是NLP算法工程师追捧…

MTK Camera2 的OPEN API流程认知

MTK的设计架构 再了解Camera的open api调用之前我们,需要了解Camera的架构,这样才能提高阅读代码的效率。 代码跟读: 在这个图中大致介绍了OpenCamera的具体调用,下面我们逐步分析Camera的open调用流程。 逐步分析 一、 我们抛…

聚焦车用AI算力,奕行智能EVAS完成超亿元Pre-A+轮融资并即将推出端侧算力芯片产品

近日,奕行智能科技(广州)有限公司(以下简称:“奕行智能”)完成超亿元人民币Pre-A轮融资。本轮融资由广州南沙科金控股集团有限公司下属广州南沙区南金基金管理有限公司作为领投方,东南亚最大的金…

绘图软件 OmniGraffle mac中文版特点说明

OmniGraffle mac是一款图形绘制和图表设计软件,主要面向 macOS 和 iOS 平台。它适用于用户创建流程图、组织结构图、原型设计、网站线框图、地图等各种类型的图形。该软件的界面直观,用户友好,让用户能够轻松地创建和编辑复杂的图形。 OmniGr…

臀部筋膜炎怎么治疗最有效

臀部筋膜炎的主要症状包括以下几点: 一、筋膜炎发生时会导致臀部疼痛以及局部红肿的情况。 二、可能会引起臀部活动受限。 三、可能会导致患者不能取坐位,因为坐位时可能由于局部压迫而引起筋膜炎疼痛症状加重,而引起患者不能取坐位的情况…

(论文阅读31/100)Stacked hourglass networks for human pose estimation

31.文献阅读笔记 简介 题目 Stacked hourglass networks for human pose estimation 作者 Alejandro Newell, Kaiyu Yang, and Jia Deng, ECCV, 2016. 原文链接 https://arxiv.org/pdf/1603.06937.pdf 关键词 Human Pose Estimation 研究问题 CNN运用于Human Pose E…

【反编译系列】二、反编译 .pyc 文件(uncompyle6)

文章目录 【反编译系列】二、反编译 .pyc 文件(uncompyle6)1. 介绍2. 反编译Reference 【反编译系列】二、反编译 .pyc 文件(uncompyle6) 1. 介绍 .pyc 文件是 Python 将 .py 源代码编译后生成的字节码文件,主要有以下几个特点和…

火山引擎DataTester上线「集成工作台」功能,助力企业打造专属AB平台

更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群 AB测试不仅是做增长的“利器”,也是企业优化效率、增加决策精确度的有效工具。随着国内企业服务市场需求的多元,企业对AB测试平台的“个性化…

如何实现可视化大屏——基于VChart

引言 在大屏产品中,可视化扮演着信息展示和传达、用户体验和互动、数据分析和决策支持、品牌展示和差异化、故事叙述和信息呈现等至关重要的角色。作为可视化图表的重要载体之一,大屏与智能BI产品不管是在产品设计,还是可视化设计的侧重点都…

YOLOv8-seg 分割代码详解(二)Train

前言 本文主要以源码注释为主,可以了解到从模型的输出到损失计算这个过程每个步骤的具体实现方法。 流程梳理 一、选取有效 anchor   以 640x640 的输入为例,模型最终有8400个 anchor,每个 anchor 都有其对应的检测输出(4n&am…

管理类联考——数学——汇总篇——知识点突破——代数——函数、方程——记忆——一元二次方程

——一元二次方程——【核心为“根”:求根,根的多少/判别式,根与系数,根的正负,根的范围/区间】 一元二次方程:只含一个未知数,且未知数的最高次数是2的方程,“元”是指方程中所含未…

出入库管理系统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…

2012年08月16日 Go生态洞察:优雅的代码组织之道

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

开源会议通知H5页面邀请函制作源码系统+自动翻页 带完整的搭建教程

现如今,线上活动越来越频繁,而会议邀请函也成为了活动组织者不可或缺的工具。然而,传统的邮件、短信等方式发送邀请函已经无法满足现代人的需求。因此,开发一款现代化的、功能丰富的会议邀请函系统势在必行。下面源码小编将来给大…

全网最全synchronized锁升级过程

一、前言 在面试题中经常会有这么一道面试题,谈一下synchronized锁升级过程? 之前背了一些,很多文章也说了,到底怎么什么条件才会触发升级,一直不太明白。 实践是检验真理的唯一标准,今天就和大家一起实…

kafka+ubuntu20.04+docker配置

记录一次配置过程 安装docker 参加下面链接的第一部分 Ubuntu20.04使用docker安装kafka服务-CSDN博客 安装zookeeper docker run -d --name zookeeper -p 2181:2181 -v /etc/localtime:/etc/localtime wurstmeister/zookeeper安装kafka服务 docker run -d --name kafka …

react路由安装配置react-router-dom/‘Switch‘ is not defined报错解决

1.安装 npm install --save react-router-dom安装完成 新建两个页面并导出 app.js import Nav from ./components/Nav import Home from ./components/Home import { Link, Route, Switch } from react-router-domfunction App() {return (<div><div><p>&…