12.16对象序列化(血干JAVA系列)

news2024/11/18 9:32:28

12.16对象序列化

12.16.1 基本概念与 Serializable 接口

在这里插入图片描述

class Person implements Serializable
{
	private String name =null;
	private int age =0 ;
	public Person(String name,int age) 
	{
		// TODO 自动生成的构造函数存根
		this.name = name;
		this.age = age;
	}
	
	@Override
	public String toString() {
		// TODO 自动生成的方法存根
		return "name:" + this.name + " \t" + "age:" + this.age ;
	}
}

在这里插入图片描述

12.16.2 对象输出流ObjectOutputStream

一个对象如果想要进行输出,则必须使用ObjectOutputStream类,此类定义如下:
public class ObjectOutputStream extends Outputstream implements Objectoutput,ObjectStreamConstants ObjectOutputStream类属于Outputstream的子类,此类的常用方法如表12-25所示。

12-25 ObjectOutputStream 常用方法
序 号 方法或常量 类 型 描 述
1 public ObjectOutputStream(OutputStream out) throws IOException 构造 传入输出的对象
2 public final void writeObject(Object obj) throws IOException 普通 输出对象

此类的使用形式与PrintStream非常相似,在实例化时也需要传入一个Outputstream的子类对象,然后根据传入的Outputstream子类的对象不同,输出的位置也不同。

【例12.71】将Person类的对象保存在文件之中

package jiaqi;

import java.io.*;
class Person implements Serializable
{
	private String name =null;
	private int age =0 ;
	public Person(String name,int age) 
	{
		// TODO 自动生成的构造函数存根
		this.name = name;
		this.age = age;
	}
	
	@Override
	public String toString() {
		// TODO 自动生成的方法存根
		return "name:" + this.name + " \t" + "age:" + this.age ;
	}
}

public class demo439_1 {

	public static void main(String[] args)throws Exception
	{
		File f =new File("d:" + File.separator + "test.txt");
		//对象输出流
		ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(f));
		//输出对象
//		oos.writeObject(new Person("杜变成",3222));
		oos.writeObject(new Person("杜艳贺",3));
		oos.close();
	}

}

在这里插入图片描述

12.16.3 对象输入流 Objectinputstream

使用ObjectI叩utStream可以直接把被序列化好的对象反序列化。ObjectlnputStream的定义如下:
public class ObjectlnputStream extends Inputstream implements Objectinput, ObjectStreamConstants ObjectlnputStream类也是InputStream的子类,与PrintStream类的使用类似,此类同样需要接收InputStream类的实例才可以实例化。主要操作方法如表12-26所示。

12-26 ObjectlnputStream的主要操作方法
序 号 方法或常量 类 型 描 述 
1 public ObjectInputStream(InputStream in) throws IOException 构造 构造输入对象
2 public final Object readObject() throws IOException, ClassNotFound Exception 普通 从指定位置读取对象

下面使用对象输入流将12.16.2节保存在文件中的对象读取出来,此过程有时也称为反序列化。

【例12.72】从文件中将Person对象反序列化(读取)

package jiaqi;

import java.io.File;
import java.io.FileInputStream;
import java.io.ObjectInputStream;

public class demo441_1 {

	public static void main(String[] args)throws Exception
	{
		// TODO 自动生成的方法存根
		ObjectInputStream ois = new ObjectInputStream(new FileInputStream(new File("d:"+ File.separator +"test.txt")));
		
		Object obj = ois.readObject();
		
		System.out.println(obj);
		
		ois.close();
		
	}

}


12.16.4 Externalizable 接口

在这里插入图片描述

在这里插入图片描述

【例12.73】修改Person类并实现Extemalizable接口

【例12.74】序列化和反序列化Person对象

package jiaqi;
import java.io.*;


class Person implements Externalizable
{
	private String name =null;
	private int age =0 ;
	public Person(){}
	public Person(String name,int age) 
	{
		// TODO 自动生成的构造函数存根
		this.name = name;
		this.age = age;
	}
	
	@Override
	public String toString() {
		// TODO 自动生成的方法存根
		return "name:" + this.name + " \t" + "age:" + this.age ;
	}
	
	//反序列化
	@Override 
	public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException 
	{
		this.age = (int)in.readInt();		
	}
	
	//序列化
	@Override
	public void writeExternal(ObjectOutput out) throws IOException 
	{
		out.writeInt(this.age);
	}
	
}
public class demo443_1
{

	public static void main(String[] args)throws Exception
	{	
		start();
		end();	
	}
	public static void start() throws Exception
	{
		ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(new File("d:"+File.separator+"test.txt")));
		oos.writeObject(new Person("du",5));
		oos.close();
		
	}
	public static void end()throws Exception
	{
		ObjectInputStream ois = new ObjectInputStream(new FileInputStream(new File("d:"+File.separator+"test.txt")));
		Object obj = ois.readObject();
		
		System.out.println(obj);
		ois.close();
	}
	
}

在这里插入图片描述

12.16.5 transient 关键字

Serializable接口实现的操作实际上是将一个对象中的全部属性进行序列化,当然也可以使用Extemalizable接口以实现部分属性的序列化,但这样操作比较麻烦。
当使用Serializable接口实现序列化操作时,如果一个对象中的某个属性不希望被序列化的话,则可以使用transient关键字进行声明,代码如下所示。

【例12.75】 Person中的name属性不希望被序列化

【例12.76】重新保存再读取对象

package jiaqi;

import java.io.*;

class Person implements Serializable
{
	private transient String name =null;
	private int age =0 ;
	
	public Person(String name,int age) 
	{
		// TODO 自动生成的构造函数存根
		this.name = name;
		this.age = age;
	}
	
	@Override
	public String toString() {
		// TODO 自动生成的方法存根
		return "name:" + this.name + " \t" + "age:" + this.age ;
	}
	

	
}
public class demo445_1
{

	public static void main(String[] args)throws Exception
	{	
		start();
		end();	
	}
	public static void start() throws Exception
	{
		ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(new File("d:"+File.separator+"test.txt")));
		oos.writeObject(new Person("du",5));
		oos.close();	
	}
	public static void end()throws Exception
	{
		ObjectInputStream ois = new ObjectInputStream(new FileInputStream(new File("d:"+File.separator+"test.txt")));
		Object obj = ois.readObject();
		
		System.out.println(obj);
		ois.close();
	}
}

12.16.6 序列化一组对象

在这里插入图片描述

【例12.77】序列化多个Person对象

package jiaqi;

import java.io.*;

class Person implements Serializable
{
	private String name = null;
	private int age = 0;
	
	public Person(String name,int age) 
	{
		this.name = name;
		this.age = age;
	}
	
	public String toString() 
	{
		return "name:" + this.name + " \t" + "age:" + this.age ;
	}	
}


public class demo446_1
{

	public static void main(String[] args)throws Exception
	{	
		Person per[] = {new Person("name3",9),new Person("name4",10),new Person("name5",11),new Person("name6",12)};
		start(per);
		Object obj[] = end();
		for(int i=0;i<obj.length;i++)
		{
			Person p = (Person)obj[i];
			System.out.println(p);
		}
	}
	public static void start(Person obj[]) throws Exception
	{
		ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(new File("d:"+File.separator+"test.txt")));
		oos.writeObject(obj);
		oos.close();
		
	}
	public static Object[] end()throws Exception
	{
		ObjectInputStream ois = new ObjectInputStream(new FileInputStream(new File("d:"+File.separator+"test.txt")));
		Object obj[] = (Object[])ois.readObject();
		
		ois.close();
		return obj;
	}

}

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

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

相关文章

第八篇【传奇开心果短博文系列】Python的OpenCV技术点案例示例:深度学习

传奇开心果短博文系列 系列短博文目录Python的OpenCV技术点案例示例系列 短博文目录一、前言二、OpenCV深度学习介绍三、OpenCV常用深度学习算法和实现分别示例代码四、归纳总结 系列短博文目录 Python的OpenCV技术点案例示例系列 短博文目录 一、前言 OpenCV深度学习&…

降压模块LM2596S的操作使用

一、技术参数 二、使用说明 1.引脚说明&#xff1a; IN输入正极 IN-输入负极 OUT输出正极 OUT-输出负极 2.输入电压范围&#xff1a;直流3.2V 至 46V (输入的电压必须比要输出的电压高1.5V以上。不能升压) 3.输出电压范围&#xff1a;直流 1.25V至 35V 电压连续可调&#…

激光雷达,角力「降本增效」

高工智能汽车研究院最新发布的数据显示&#xff0c;2023年1-11月&#xff0c;中国市场&#xff08;不含进出口&#xff09;乘用车前装标配激光雷达搭载量为46.48万颗&#xff0c;同比增长372.35%&#xff0c;继续保持高增长态势。 随着激光雷达在中国市场完成规模化上量的节点&…

C++(16)——vector的模拟实现

前面的文章中&#xff0c;给出了对于的模拟实现&#xff0c;本篇文章将给出关于的模拟实现。 目录 1.基本框架&#xff1a; 2. 返回值与迭代器&#xff1a; 2.1 返回值capacity与size: 2.2 两种迭代器iterator和const_iterator: 3. 扩容与push_back与pop_back&#xff1a…

好友管理系统----Python实例练习

题目描述 如今的社交软件层出不穷&#xff0c;虽然功能千变万化&#xff0c;但都具有好友管理系统的基本功能&#xff0c;包括添加好友&#xff0c;删除好友&#xff0c;备注好友&#xff0c;展示好友等。次案例要求用Python中的列表知识实现。 程序代码 print("欢迎使…

你还在使用websocket实现实时消息推送吗?

前言 在日常的开发中&#xff0c;我们经常能碰见服务端需要主动推送给客户端数据的业务场景&#xff0c;比如数据大屏的实时数据&#xff0c;比如消息中心的未读消息&#xff0c;比如聊天功能等等。 本文主要介绍SSE的使用场景和如何使用SSE。 服务端向客户端推送数据的实现…

LabVIEW扫频阻抗测试系统

实现扫频阻抗法用于检测变压器绕组变形&#xff0c;结合了短路阻抗法和频响法的优点&#xff0c;但受限于硬件精度&#xff0c;尤其是50 Hz短路阻抗测试存在稳定性和准确性的问题。通过LabVIEW编程&#xff0c;控制宽频带信号发生器和高速采集卡&#xff0c;提高测试结果的稳定…

【大数据】Flink 架构(二):数据传输

《Flink 架构》系列&#xff08;已完结&#xff09;&#xff0c;共包含以下 6 篇文章&#xff1a; Flink 架构&#xff08;一&#xff09;&#xff1a;系统架构Flink 架构&#xff08;二&#xff09;&#xff1a;数据传输Flink 架构&#xff08;三&#xff09;&#xff1a;事件…

(2)(2.9) Holybro Microhard P900无线电遥测设备

文章目录 前言 1 特点 2 规格 3 包装内包括 前言 Holybro Microhard Radio 集成了 microhard Pico 系列射频模块&#xff0c;能够在强大的拓扑结构中提供高性能无线串行通信&#xff0c;如点对点、点对多点和安全 Mesh&#xff08;P840 不提供 Mesh&#xff09;。 它采用跳…

翻译: GPT-4 Vision静态图表转换为动态数据可视化 升级Streamlit 三

GPT-4 Vision 系列: 翻译: GPT-4 with Vision 升级 Streamlit 应用程序的 7 种方式一翻译: GPT-4 with Vision 升级 Streamlit 应用程序的 7 种方式二 1. 将任何静态图表转换为动态数据可视化 ChatGPT Vision 不仅可以将涂鸦变成功能齐全的 Streamlit 应用程序&#xff0c;还…

关机恶搞小程序

1. system("shutdown")的介绍 当system函数的参数是"shutdown"时&#xff0c;它将会执行系统的关机命令。 具体来说&#xff0c;system("shutdown")的功能是向操作系统发送一个关机信号&#xff0c;请求关闭计算机。这将触发操作系统执行一系列…

Java项目:基于SSM框架实现的企业员工岗前培训管理系统(ssm+B/S架构+源码+数据库+毕业论文)

一、项目简介 本项目是一套ssm821基于ssm框架实现的企业员工岗前培训管理系统&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格…

w24文件上传之PHP伪协议

PHP支持的伪协议 file:// - 访问本地文件系统 http:// - 访问网址 ftp:// - 访问文件 php:// -访问各个输入/输出流 zlib:// -压缩流 data:// - 数据 glob:// -查找匹配的文件路径模式 phar:// - php归档 ssh2:// - Secure shell 2 rar:// - RAR ogg:// - 音频流 expect:// - …

【Python从入门到进阶】48、当当网Scrapy项目实战(一)

接上篇《47、Scrapy Shell的了解与应用》 上一篇我们学习了Scrapy终端命令行工具Scrapy Shell&#xff0c;并了解了它是如何帮助我们更好的调试爬虫程序的。本篇我们将正式开启一个Scrapy爬虫项目的实战&#xff0c;对当当网进行剖析和抓取。 一、当当网介绍 当当网成立于199…

字符串函数(1)

目录 大小写转换 首字母大写 计算字符串的长度 Oracle从入门到总裁:https://blog.csdn.net/weixin_67859959/article/details/135209645 字符串函数可以对字符串数据进行处理&#xff0c;在 Oracle 中此类函数主要有如下几种&#xff1a; UPPER()、LOWER()、INITCAP()、REP…

PMP五大过程组:项目成功的金钥匙

在项目管理领域&#xff0c;PMP&#xff08;项目管理专业&#xff09;一直被视为权威的标准。PMP认证的项目管理方法论&#xff0c;即五大过程组和十大知识领域&#xff0c;为项目管理提供了一套完整、系统的方法论。五大过程组作为PMP的核心&#xff0c;涵盖了项目从开始到结束…

bert新闻标题分类

使用 bert 完成文本分类任务&#xff0c;数据有 20w&#xff0c;来自https://github.com/649453932/Bert-Chinese-Text-Classification-Pytorch/tree/master/THUCNews 下载即可&#xff1a; 模型使用 bert-base-chinese 下载参考&#xff1a;bert预训练模型下载-CSDN博客 实现了…

无人机在三维空间中的转动问题

前提 这篇博客是对最近一个有关无人机拍摄图像项目中所学到的新知识的一个总结&#xff0c;比较杂乱&#xff0c;没有固定的写作顺序。 无人机坐标系旋转问题 上图是无人机坐标系&#xff0c;绕x轴是翻滚(Roll)&#xff0c;绕y轴是俯仰(Pitch)&#xff0c;绕z轴是偏航(Yaw)。…

微信小程序(二十三)获取页面栈及当前页面实例

注释很详细&#xff0c;直接上代码 上一篇 新增内容&#xff1a; 1.页面栈的定义 2.获取当前页面实例 页面栈 当我们从A页面跳到B页面再跳到C页面时&#xff0c;页面栈则是由三个页面的实例组成的数组&#xff0c;A在下标为0的数组中&#xff0c;C在下标为2的数组中 当然&#…

【JaveWeb教程】(30)SpringBootWeb案例之《智能学习辅助系统》的详细实现步骤与代码示例(3)员工管理的实现

目录 SpringBootWeb案例033. 员工管理3.1 分页查询3.1.1 基础分页3.1.1.1 需求分析3.1.1.2 接口文档3.1.1.3 思路分析3.1.1.4 功能开发3.1.1.5 功能测试3.1.1.6 前后端联调 3.1.2 分页插件3.1.2.1 介绍3.1.2.2 代码实现3.1.2.3 测试 3.2 分页查询(带条件)3.2.1 需求3.2.2 思路分…