20.Java序列化

news2024/12/24 11:33:45

Java序列化

一、序列化和反序列化

  • 序列化:指堆内存中的java对象数据,通过某种方式把对存储到磁盘文件中,或者传递给其他网络节点(网络传输)。这个过程称为序列化,通常是指将数据结构或对象转化成二进制的过程。
  • 反序列化:把磁盘文件中的对象数据或者把网络节点上的对象数据,恢复成Java对象模型的过程。也就是将在序列化过程中所生成的二进制串转换成数据结构或者对象的过程。

二、实现对象序列化

public class Student implements Serializable{

	private static final long serialVersionUID = 3547145316233835846L;

	private String name;
	
	private int age;

	
	public Student() {
	}
	public Student(String name, int age) {
		this.name = name;
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public static long getSerialversionuid() {
		return serialVersionUID;
	}
}

public static void main(String[] args) {
		Student student = new Student("张三", 18);

		// 对象序列化
		try {
			ObjectOutputStream oos = null;
			FileOutputStream fos = null;
			fos = new FileOutputStream("D:\\1.txt");
			oos = new ObjectOutputStream(fos);
			oos.writeObject(student);
			fos.close();
			oos.close();
		} catch (Exception e) {
			e.printStackTrace();
		}

		//反序列化
		Student student1 = null;
		try {
			ObjectInputStream ois = null;
			FileInputStream fis = null;

			fis = new FileInputStream("D:\\1.txt");
			ois = new ObjectInputStream(fis);
			Object object = ois.readObject();
			student1 = (Student) object;
			fis.close();
			ois.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		System.out.println(student1.getName()+"今年"+student1.getAge());
	}

在这里插入图片描述

三、对象序列化实现步骤

  • 对象类实现Serializable接口
  • 生成序列号private static final long serialVersionUID =
    3547145316233835846L;
  • 使用IO流中的对象流可以实现序列化操作,将对象保存到文件,再读取出来。

四、序列化ID的作用
这个序列化ID起着关键的作用,它决定着是否能够成功反序列化!java的序列化机制是通过判断运行时类的serialVersionUID来验证版本一致性的,在进行反序列化时,JVM会把传进来的字节流中的serialVersionUID与本地实体类中的serialVersionUID进行比较,如果相同则认为是一致的,便可以进行反序列化,否则就会报序列化版本不一致的异常。

五、序列化的其他问题

  • 静态变量不会被序列化( static,transient)
  • 当一个父类实现序列化,子类自动实现序列化,不需要显式实现Serializable接口。
  • 当一个对象的实例变量引用其他对象,序列化该对象时也把引用对象进行序列化。

六、排序比较

  • 专门为对象创建一个比较器,一般用匿名内部类来创建
public class Student{

	private String name;
	
	private int age;

	
	public Student() {
	}
	public Student(String name, int age) {
		this.name = name;
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}


}


public static void main(String[] args) {
		Student student_1 = new Student("张三", 18);

		Student student_2 = new Student("李四", 18);
		
		List<Student> list=new ArrayList<Student>();
		list.add(student_1);
		list.add(student_2);
		Collections.sort(list,new Comparator<Student>() {

			@Override
			public int compare(Student o1, Student o2) {
				int retu=0;
				if(o1.getAge()<o2.getAge()) {
					retu=1;
				}else if(o1.getAge()>o2.getAge()) {
					retu=-1;
				}else {
					char name_1=o1.getName().charAt(0);
					char name_2=o2.getName().charAt(0);
					if(name_1<name_2) {
						retu=1;
					}else {
						retu=-1;
					}
				}
				return retu;
			}

			
		});
		
		for (Student student : list) {
			System.out.println(student.getName()+":"+student.getAge());
		}
		
		
	}

在这里插入图片描述

  • 排序对象中实现Comparable接口 通过重写其compareTo方法
public class Student implements Comparable<Student>{

	private String name;
	
	private int age;

	
	public Student() {
	}
	public Student(String name, int age) {
		this.name = name;
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}

	@Override
	public int compareTo(Student o) {
		int age_1=this.age;
		int age_2=o.age;
		int retu=0;
		if(age_1<age_2) {
			retu=1;
		}else {
			retu=-1;
		}
		return retu;
	}
}

public static void main(String[] args) {
		Student student_1 = new Student("张三", 18);

		Student student_2 = new Student("张三", 35);
		
		List<Student> list=new ArrayList<Student>();
		list.add(student_1);
		list.add(student_2);
		Collections.sort(list);
		
		for (Student student : list) {
			System.out.println(student.getName()+":"+student.getAge());
		}
		
		
	}

在这里插入图片描述

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

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

相关文章

IPC行业信息汇总

IPC&#xff1a;“网络摄像机”&#xff0c;是IP Camera的简称。它是在前一代模拟摄像机的基础上&#xff0c;集成了编码模块后的摄像机。它和模拟摄像机的区别&#xff0c;就是在新增的“编码模块”上。 模拟摄像机&#xff0c;顾名思义&#xff0c;输出的是模拟视频信号。模拟…

大数据系列——Spark理论

概述 Apache Spark&#xff0c;全称伯克利数据分析栈&#xff0c;是一个开源的基于内存的通用分布式计算引擎&#xff0c;内部集成大量的通用算法&#xff0c;包括通用计算、机器学习、图计算等&#xff0c;用于处理大数据应用。 主要由下面几个核心构件组成&#xff0c;具体包…

C++、STL标准模板库和泛型编程 ——适配器、补充(侯捷)

C、STL标准模板库和泛型编程 ——适配器 &#xff08;侯捷&#xff09;--- 持续更新 适配器&#xff08;Adapters&#xff09;容器适配器&#xff08;Container Adapters&#xff09;仿函数适配器&#xff08;Functor Adapters&#xff09;bind2nd&#xff08;绑定第二实参&…

Tomcat源码:Pipeline与Valve

参考资料&#xff1a; 《Tomcat组成与工作原理》 《Tomcat - Container的管道机制&#xff1a;责任链模式》 《Tomcat源码解析系列 Pipeline 与 Valve》 前文&#xff1a; 《Tomcat源码&#xff1a;启动类Bootstrap与Catalina的加载》 《Tomcat源码&#xff1a;容器的生命…

Mybatis源码01-Executor

前言 为了方便公司业务排查问题&#xff0c;要求打印执行的sql&#xff0c;以及执行时间。编写了一个Mybatis的拦截器&#xff0c;此前从未看过mybatis的源码&#xff0c;在调试的过程中不断阅读源码&#xff0c;后边想更深刻了解一下&#xff0c;看了鲁班大叔的视频&#xff…

OSCP-Nickel(爆破pdf、本地http提权)

目录 扫描 HTTP 提权 扫描 FileZilla不接受匿名FTP登录。 端口21上的SSH和3389上的RDP很少是初始入口点,但是如果遇到一些凭据,可以记住这一点。 HTTP 打开Web浏览器并导航到端口8089和3333,用于的HTTP服务器。端口8089似乎是某种类型的开发环境。 单击一个按钮重定向到…

boot-admin整合Quartz实现动态管理定时任务

淄博烧烤爆红出了圈&#xff0c;当你坐在八大局的烧烤摊&#xff0c;面前是火炉、烤串、小饼和蘸料&#xff0c;音乐响起&#xff0c;啤酒倒满&#xff0c;烧烤灵魂的party即将开场的时候&#xff0c;你系统中的Scheduler&#xff08;调试器&#xff09;&#xff0c;也自动根据…

在函数中使用变量

shell脚本编程系列 向函数传递参数 函数可以使用标准的位置变量来表示在命令行中传给函数的任何参数。其中函数名保存在$0变量中&#xff0c;函数参数则依次保存在$1、$2等变量当中&#xff0c;也可以使用特殊变量$#来确定参数的个数 在脚本中调用函数时&#xff0c;必须将参…

day3 TCP/IP协议与五层体系结构

TCP / IP 四层体系结构 TCP / IP工作流程&#xff1a; 现在互联网使用的 TCP/IP 体系结构已经发生了演变&#xff0c;即某些应用程序可以直接使用 IP 层&#xff0c;或甚至直接使用最下面的网络接口层。 沙漏型展示&#xff1a; 五层体系结构 各层的主要功能 应用层&#xff1…

C++ Primer阅读笔记--语句的使用

① 空语句 最简单的语句是空语句&#xff0c;其只含有一个单独的分号&#xff1b; ② switch语句 case 关键字和它对应的值一起被称为 case 标签&#xff0c;case 标签必须是整型常量表达式&#xff1b; char ch getVal(); int iVal 42; switch(ch){case 3.14: // 错误&#…

ZmosHarmony buildroot移植与使用

前言 移植过程 1、添加编译选项编译buildroot。 2、开机启动时设置 LD库的环境变量与PATH路径。 是什么原因需要这样操作&#xff1f; 主要使用busybox&#xff0c;使用buildroot的瑞士军dao。 使用busybox 为buildroot下的使用 第一次启动时设置 由于是在vendor分区因此 …

01 openEuler虚拟化-KVM虚拟化简介

文章目录 01 openEuler虚拟化-KVM虚拟化简介1.1 简介1.2 虚拟化架构1.3 虚拟化组件1.4 虚拟化特点1.5 虚拟化优势1.6 openEuler虚拟化 01 openEuler虚拟化-KVM虚拟化简介 1.1 简介 在计算机技术中&#xff0c;虚拟化是一种资源管理技术&#xff0c;它将计算机的各种实体资源&…

ActiveMQ 反序列化漏洞 (CVE-2015-5254)漏洞复现

当前漏洞环境部署在vulhub,当前验证环境为vulhub靶场&#xff08;所有实验均为虚拟环境&#xff09; 实验环境&#xff1a;攻击机----kali 靶机&#xff1a;centos7 需要的jar包&#xff1a;jmet-0.1.0-all.jar 1、启动docker&#xff0c;进入vulhub&#xff08;靶机&#xff0…

centos主机测试io极限

这里使用fio工具来测试磁盘的io 1.安装fio命令 yum -y install fio 2.在需要测试的磁盘所挂载的目录下创建一个测试目录 由于我就只有一个磁盘&#xff0c;/目录也挂载在这个磁盘上&#xff0c;所以就直接在tmp目录里创建 mkdir /tmp/cs 3.创建一个名为 test.fio 的文件&a…

中级软件设计师备考---信息系统安全

目录 安全属性对称加密技术非对称加密技术信息摘要和数字签名数字信封和PGP各个网络层次的安全保障网络威胁与攻击防火墙技术 安全属性 保密性&#xff1a;最小授权原则、防暴露、信息加密、物理保密 完整性&#xff1a;安全协议、校验码、密码校验、数字签名、公证 可用性&a…

【 Spring 事务传播机制 】

文章目录 一、概念二、为什么需要事务传播机制&#xff1f;三、事务传播机制有哪些&#xff1f;四、Spring 事务传播机制使⽤和各种场景演示4.1 ⽀持当前事务&#xff08;REQUIRED&#xff09;4.2 不⽀持当前事务&#xff08;REQUIRES_NEW&#xff09;4.3 NESTED 嵌套事务4.4 嵌…

软考软件设计师 软件工程笔记

软件工程 CMM&#xff08;能力成熟度模型&#xff09;CMMI&#xff08;能力成熟度模型集成&#xff09;瀑布模型V模型&#xff08;质量保证&#xff09;增量模型演化模型&#xff08;迭代更新&#xff09;原型模型螺旋模型&#xff08;风险分析&#xff09;喷泉模型统一过程&am…

大数据编程实验二:熟悉常用的HDFS操作

实验目的 1、理解HDFS在Hadoop体系结构中的角色 2、熟悉使用HDFS操作常用的Shell命令 3、熟悉HDFS操作常用的Java API 实验平台 1、操作系统&#xff1a;Windows 2、Hadoop版本&#xff1a;3.1.3 3、JDK版本&#xff1a;1.84、Java IDE&#xff1a;IDEA 实验步骤 前期&#x…

Springboot整合WebSocket(纯后端)

文章目录 一、 HTTP协议与WebSocket区别二、客户端&#xff08;浏览器&#xff09;实现1、websocket对象2、websocket事件3、WebSocket方法 三、服务端实现1、连接过程2、服务端接收客户端消息3、服务端推送消息给客户端 四、后端功能实现 一、 HTTP协议与WebSocket区别 HTTP协…

如何在家自学编程成为一名程序员?

转自&#xff1a;如何在家自学编程&#xff0c;成为一名优秀的程序员&#xff1f; - 知乎 跟着黑马程序员学&#xff0c;自学也可以很优秀。先找到方向—>前/后端&#xff1f;测试&#xff1f;还是什么&#xff1f;—>找到相关的学习路线 —> 坚持不懈的学习 —> …