JAVA进阶教学之(序列化和反序列化)

目录

 

1、序列化Serialize和反序列化的概念

2、序列化和反序列化的代码演示:

3、序列化多个对象(序列化集合)

4、transient关键字将部分属性不参与序列化


 

 

1、序列化Serialize和反序列化的概念

在内存和硬盘的数据交互过程中,将Java对象拆分的过程

序列化就是将Java内存中的Java对象切割成像序列一样传递到硬盘文件中存储 (拆分对象)

反序列化就是通过硬盘序列好的Java对象组装重新返回到Java内存中(组装对象)

 

图示:

 

2、序列化和反序列化的代码演示:

序列化:

通过代码演示来加深理解:

首先创建一个普通的Student学生类,这个学生类没有实现任何接口,就是普通的:

package com.lbj.javase.bean;import java.io.Serializable;public class Student{private int no;private String name;public Student() {}public Student(int no, String name) {this.no = no;this.name = name;}public int getNo() {return no;}public void setNo(int no) {this.no = no;}public String getName() {return name;}public void setName(String name) {this.name = name;}//重写toString方法@Overridepublic String toString() {return "Student{" +"no=" + no +", name='" + name + '\'' +'}';}
}

 

再创建一个测试类,将Student对象进行序列化:

package com.lbj.javase.bean;import java.io.FileOutputStream;
import java.io.ObjectOutputStream;public class ObjectOutputStreamTest01{public static void main(String[] args) throws Exception{//创建java对象Student s=new Student(123,"zhangsan");//包装类FileOutputStream fos=new FileOutputStream("student");//序列化ObjectOutputStream oos=new ObjectOutputStream(fos);//序列化对象oos.writeObject(s);//刷新oos.flush();//关闭oos.close();}
}

报错:

总结:

Student是一个普通的类,并不支持序列化,需要加上Serializable的实现结构

 

 

修改测试(此时的Student类实现了Serializable接口):

package com.lbj.javase.bean;import java.io.Serializable;//Serializable只是一个标志性接口,这个接口其实什么都不写
public class Student implements Serializable {private int no;private String name;public Student() {}public Student(int no, String name) {this.no = no;this.name = name;}public int getNo() {return no;}public void setNo(int no) {this.no = no;}public String getName() {return name;}public void setName(String name) {this.name = name;}//重写toString方法@Overridepublic String toString() {return "Student{" +"no=" + no +", name='" + name + '\'' +'}';}
}

测试:

package com.lbj.javase.bean;import java.io.FileOutputStream;
import java.io.ObjectOutputStream;public class ObjectOutputStreamTest01{public static void main(String[] args) throws Exception{//创建java对象Student s=new Student(123,"zhangsan");//包装类FileOutputStream fos=new FileOutputStream("student");//序列化ObjectOutputStream oos=new ObjectOutputStream(fos);//序列化对象oos.writeObject(s);//刷新oos.flush();//关闭oos.close();}
}

测试结果:

总结:

1、参与序列化和反序列化的对象,必须实现Serializable接口

2、Serializable接口只是一个标志性接口,这个接口中什么也没有,只是起到让java虚拟机看到这个类实现了这个接口,可能对这个类特殊的待遇,java虚拟机会默认提供这个序列化的版本号(序列化版本号是用来区分序列化的类是否发生改变,用来达到安全性)

3、java虚拟机会自动序列化版本号,缺点。一旦被序列化的类A的代码确定后,不能进行后续的修改;只要修改,必定会重新编译,此时类A会生成全新的序列化版本号,这时候java虚拟机会认为这是一个全新的类(这样就不好了,会反序列化不成功,因为反序列化是根据序列化版本号进行重新读取)

4、结论:凡是一个类实现了Serializable接口,建议给该类一个固定不变的序列化版本号,这样,以后这个类即使代码修改了,但是版本号不变,java虚拟机会认为是同一个类(Idea中可以生成一个序列化版本号,自己去探索,或者自己写一个也行)(P756)

 

 

-----------------------------------------------------------------------------------------------------------------------------------

 

反序列化:

代码演示:

package com.lbj.javase.bean;import java.io.FileInputStream;
import java.io.ObjectInputStream;public class ObjectInputStreamTest01 {public static void main(String[] args) throws Exception{//包装类FileInputStream fis=new FileInputStream("student");//序列化ObjectInputStream ois=new ObjectInputStream(fis);//开始反序列化,读Object obj=ois.readObject();//输出obj内容//反序列化回来是一个学生对象,所以会调用学生对象的toString方法System.out.println(obj.toString());//关闭流ois.close();}
}

输出结果:

Student{no=123, name='zhangsan'}

 

 

3、序列化多个对象(序列化集合)

代码演示:

创建一个实现Serializeable接口的Student类:

package com.lbj.javase.bean;import java.io.Serializable;//Serializable只是一个标志性接口,这个接口其实什么都不写
public class Student implements Serializable {private int no;private String name;public Student() {}public Student(int no, String name) {this.no = no;this.name = name;}public int getNo() {return no;}public void setNo(int no) {this.no = no;}public String getName() {return name;}public void setName(String name) {this.name = name;}//重写toString方法@Overridepublic String toString() {return "Student{" +"no=" + no +", name='" + name + '\'' +'}';}
}

 

序列化:

package com.lbj.javase.bean;import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.List;public class ObjectOutputStreamTest02 {public static void main(String[] args) throws Exception{//创建一个集合对象List<Student> list=new ArrayList<>();//添加集合数据list.add(new Student(111,"lisi"));list.add(new Student(222,"Wanwu"));list.add(new Student(333,"liliu"));//输出流FileOutputStream fos=new FileOutputStream("students");//序列化ObjectOutputStream oos=new ObjectOutputStream(fos);//序列化一个集合,这个杰辉对象中放了很多其他对象oos.writeObject(list);//刷新流oos.flush();//关闭流oos.close();}
}

 

反序列化:

package com.lbj.javase.bean;import java.io.FileInputStream;
import java.io.ObjectInputStream;
import java.util.List;public class ObjectInputStreamTest02 {public static void main(String[] args) throws Exception{//输入流FileInputStream fis=new FileInputStream("students");//反序列化ObjectInputStream ois=new ObjectInputStream(fis);//        Object obj=ois.readObject();
//        System.out.println(obj.toString());//用列表形式输出List<Student> list = (List<Student>) ois.readObject();//集合的循环输出for (Student s:list) {System.out.println(s);}//关闭流ois.close();}
}

 

结果:

Student{no=111, name='lisi'}
Student{no=222, name='Wanwu'}
Student{no=333, name='liliu'}

 

 

注意:如果不用集合,直接存储多个对象,在存储第二个对象的时候会报错

 

 

4、transient关键字将部分属性不参与序列化

transient表示游离的,不参与序列化,只要给属性加上此限制,即可

演示:

结果(数据变成null):

 

 

 

 

 

 

 

 

 

 

 

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

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

相关文章

java如何实现e的次方_Java开发如何更改MySQL数据库datadir目录之MySQL数据库索引实现...

引言MySQL是一个关系型数据库管理系统&#xff0c;由瑞典MySQL AB 公司开发&#xff0c;目前属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一&#xff0c;在 WEB 应用方面&#xff0c;MySQL是最好的 RDBMS (Relational Database Management System&#xff0c…

pytorch 训练过程acc_Pytorch之Softmax多分类任务

在上一篇文章中&#xff0c;笔者介绍了什么是Softmax回归及其原理。因此在接下来的这篇文章中&#xff0c;我们就来开始动手实现一下Softmax回归&#xff0c;并且最后要完成利用Softmax模型对Fashion MINIST进行分类的任务。在开始实现Softmax之前&#xff0c;我们先来了解一下…

进程调度实验_Linux应用编程之进程的PID与PPID

关注、星标公众号&#xff0c;直达精彩内容ID&#xff1a;嵌入式情报局作者&#xff1a;情报小哥1进程PID首先介绍PID的相关知识&#xff0c;为后面介绍fork函数进行铺垫。01PID与PPID PID不是控制理论的PID算法&#xff0c;而是Prcess ID的简写。进程PID是当操作系统运行进程时…

操作Windows文件夹时,弹出文件夹正在使用,操作无法完成【解决】

在windows系统上&#xff0c;有时候在删除系统文件或文件夹时出现弹框&#xff0c;提示操作无法完成。这种情况的出现是因为你要删除的文件或文件夹被打开&#xff0c;或者被系统占用。遇到这种情况要怎么处理呢&#xff0c;本文介绍下具体的操作方法来帮助你解决这个问题。 方…

邀请合作如何表达_适时表达想法 才有利于彼此的合作

丹尼跟珍妮合作主持一个podcast节目&#xff0c;两人对这个节目兴致勃勃&#xff0c;并花很多时间投入&#xff0c;珍妮想邀请自己身边朋友一起参加&#xff0c;认为特别来宾可以增加节目的丰富度&#xff1b;丹尼却觉得现在节目才刚开始起步&#xff0c;要建立好两人的节目定位…

idea代码可以编译但是爆红_推荐一款 IDEA 生成代码神器,写代码再也不用加班了...

作者&#xff1a;HeloWxl链接&#xff1a;https://www.jianshu.com/p/e4192d7c6844Easycode是idea的一个插件&#xff0c;可以直接对数据的表生成entity,controller,service,dao,mapper,无需任何编码&#xff0c;简单而强大。1、安装(EasyCode)我这里的话是已经那装好了。建议大…

html跑马灯_用Excel居然能做“跑马灯”,而且还这么简单!

我的目标&#xff1a;让中国的大学生走出校门的那一刻就已经具备这些office技能&#xff0c;让职场人士能高效使用office为其服务。支持我&#xff0c;也为自己加油&#xff01;你没看错&#xff0c;上面这个就是用Excel做出来的&#xff0c;不过要用到窗体和控件。步骤如下&am…

c语言双链表排序交换节点_图解:单链表翻转的三种方式!

当我们在聊到链表反转的时候&#xff0c;一定说的都是单链表&#xff0c;双链表本身就具有前驱指针 Prev 和后续指针 next&#xff0c;无需进行翻转。单链表反转&#xff0c;反转后的效果如下&#xff1a;看起来很简单&#xff0c;只需要将单链表所有结点的 next 指向&#xff…

wsdl文档中的soap:address的生成规则_BAT大牛都在使用的数据库文档生成插件,不来看一下?...

一、概述在企业级开发中、我们经常会有编写数据库表结构文档的时间付出&#xff0c;从业以来&#xff0c;待过几家企业&#xff0c;关于数据库表结构文档状态&#xff1a;要么没有、要么有、但都是手写、后期运维开发&#xff0c;需要手动进行维护到文档中&#xff0c;很是繁琐…

修订模式怎么彻底关闭_电脑玩游戏卡顿怎么办?

电脑玩游戏卡怎么办&#xff1f;在玩游戏时电脑卡真的是会气死人的&#xff0c;特别是在打团的时候卡了&#xff0c;想砸电脑有木有&#xff1f;那么电脑玩游戏卡怎么办呢&#xff1f;给大家介绍几个方法&#xff0c;可以尝试改善卡顿。软件方面&#xff1a;1、 开启电源性能模…

datepicker不能选择是为什么_为什么客厅不好看?休闲椅选错了

为什么客厅不好看&#xff1f;休闲椅选错了很多装修完毕的小伙伴们经常有这样一个疑问: 为什么我家的客厅看上去这么凌乱&#xff0c;一点都没有想象中井然有致&#xff1f;这其中的潜在原因有很多&#xff0c;比如沙发墙的装饰设计有误&#xff0c;比如各类家具的款式搭配不对…

如何打开屏幕坏的手机_每天打开手机屏幕20次?打开10次以上的朋友进~

现代社会最很普遍的现象就是不管有没有事&#xff0c;不断地打开手机屏幕看时间或者刷各种信息和段子。 一块小小的屏幕却有着巨大的魅力。明明没有任何事情要干&#xff0c;却还是忍不住诱惑(cant resist temptation [tɛmpˈteʃən])想要打开屏幕&#xff0c;仿佛潘多拉的盒…

mvc 两个控制器session 丢失_用纯 JavaScript 撸一个 MVC 程序

前言我想用 model-view-controller 架构模式在纯 JavaScript 中写一个简单的程序&#xff0c;于是我这样做了。希望它可以帮你理解 MVC&#xff0c;因为当你刚开始接触它时&#xff0c;它是一个难以理解的概念。我做了这个todo应用程序&#xff0c;这是一个简单小巧的浏览器应用…

redis线程阻塞原因排插_每次面试都要被问:为什么采用单线程的Redis也会如此之快?...

众所周知&#xff0c;Redis在内存库数据库领域非常地火热&#xff0c;它极高的性能和丰富的数据结构为我们的开发提供了极大的便利。但我们也听说了&#xff0c;Redis是单线程的&#xff0c;为什么采用单线程的Redis也会如此之快呢&#xff1f;这篇文章我们来分析一下其中的缘由…

审计日志_Oracle审计日志过大?如何清理及关闭审计机制?

概述oracle 11g推出了审计功能&#xff0c;但这个功能会针对很多操作都产生审计文件.aud&#xff0c;日积月累下来这些文件也很多&#xff0c;默认情况下&#xff0c;系统为了节省资源&#xff0c;减少I/0操作&#xff0c;其审计功能是关闭的。这段时间发现审计占了比较多空间&…

servlet如何使用session把用户的手机号修改_SpringBoot源码学习系列之嵌入式Servlet容器...

1、前言简单介绍SpringBoot的自动配置就是SpringBoot的精髓所在&#xff1b;对于SpringBoot项目是不需要配置Tomcat、jetty等等Servlet容器&#xff0c;直接启动application类既可&#xff0c;SpringBoot为什么能做到这么简捷&#xff1f;原因就是使用了内嵌的Servlet容器&…

mybatisplus新增返回主键_第17期:索引设计(主键设计)

表的主键指的针对一张表中的一列或者多列&#xff0c;其结果必须能标识表中每行记录的唯一性。InnoDB 表是索引组织表&#xff0c;主键既是数据也是索引。主键的设计原则1. 对空间占用要小上一篇我们介绍过 InnoDB 主键的存储方式&#xff0c;主键占用空间越小&#xff0c;每个…

mysql 集群与主从_Mysql集群和主从

1、Mysql cluster: share-nothing,分布式节点架构的存储方案&#xff0c;以便于提供容错性和高性能。需要用到mysql cluster安装包&#xff0c;在集群中的每一个机器上安装。有三个关键概念&#xff1a;Sql节点(多个)&#xff0c;数据节点(多个)&#xff0c;管理节点(一个)&…

redis缓存原理与实现_基于Redis实现范围查询的IP库缓存设计方案

点击上方“码农沉思录” 发现更多精彩我先说下结果。我现在还不敢放线上去测&#xff0c;这是本地测的数据&#xff0c;我4g内存的电脑本地开redis&#xff0c;一次都没写完过全部数据&#xff0c;都是写一半后不是redis挂就是测试程序挂。可以肯定的是总记录数是以千万为单位…

mysql原生库_Mysql数据库的一些简单原生sql语句

原生sql语句查询&#xff1a;select * from 表名 &#xff1a;查找表内所有数据&#xff0c; * 代表所有where 具体条件 :where作位查询sql语句条件&#xff0c;例 select * from 表名 where 字段名指定值order by 升降序&#xff1a;与desc和asc使用,通常以int类型字段进行升…