序列化与反序列化(1)Serializable —— Java原生态方法

摘自:序列化与反序列化(1)Serializable —— Java原生态方法
作者:丶PURSUING
发布时间: 2021-05-08 19:20:21
网址:https://blog.csdn.net/weixin_44742824/article/details/116503261

本文为学习笔记,所用的图片、案例均为教学视频截图

源视频地址:Android开发基础教程(2019)第35集 序列化(1)
作者:longway777

何为序列化

将对象转换为字节序列,完整的保存在磁盘上,或者通过网络发送出去。

在这里插入图片描述

反序列化就是将对象重新创建出来
在这里插入图片描述
序列化的三种方式
在这里插入图片描述

Serializable

java自带的接口,使用起来很简单,只需要一句话的标注就可以,具体实现也不需要做,全部是由jdk完成。缺点是效率不高,但对于应用程序级别已经够用。

Parcelable

专为安卓定制,深度优化,效率很高,在安卓系统的底层扮演了非常重要的角色,进程调度交换数据,交换对象等必不可少。

Json

基于文本的序列化,相对于二进制文件文本具有很高的可读性,广泛应用。

在这里插入图片描述

效果演示

本篇章先使用第一个方法,Serializable 实现对象的序列化以及反序列化。

通过输入内容,点击Save按钮后将对象保存在文件中(序列化),点击load读取文件中的内容,反序列化使对象重建并显示在屏幕上。
在这里插入图片描述

一、创建界面

在这里插入图片描述

二、创建student类

创建student类,包含属性名字、姓名、分数等,类要实现接口:Serializable。并且设置getter、setter,实现构造方法等。(具体看最后的源码)

alt+insert,选择构造,创建他们三个的构造方法。
在这里插入图片描述

完成他们的setter和gerter
在这里插入图片描述

三、点击按钮创建对象写入到文件中

在这里插入图片描述

try catch

没有处理可能发生的异常
在这里插入图片描述这种IO的操作,包括像是网络的操作,是不可靠的,不一定成功,可能会出错(比如文件不存在,磁盘故障),所以需要做异常处理避免应用程序产生异常而崩溃。

尝试执行

尝试执行try里面的内容,如果不成功就会返回一个异常值,这里把他打印出来。

举一个很简单的例子
在这里插入图片描述并且程序没有闪退
在这里插入图片描述SAVE完成后,点击执行:

在这里插入图片描述

在文件系统中可以找到创建的文件
在这里插入图片描述

是二进制序列的字节文件,看着像是乱码
在这里插入图片描述

可以用hex转换工具大致看看
在这里插入图片描述
在这里插入图片描述

toast的快速自动补全

输入Toast按下tab键自动补全
在这里插入图片描述

四、点击按钮反序列化重建对象

可能的错误,两个catch
在这里插入图片描述
快速try
在这里插入图片描述
点击按钮后反序列化并且对象重建在屏幕上
在这里插入图片描述

关键代码

虽然代码看似很多,但序列化真正涉及到的就是序列化后写入文件中,然后反序列化读出来,还有类要继承的接口

student.java

创建student类,包含属性名字、姓名、分数等,类要实现接口:Serializable。并且设置getter、setter,实现构造方法等。

//如果某个属性不需要序列化,可以添加关键字:transient
public class Student implements Serializable {private String name;private int age;private Score score;public Student(String name, int age, Score score) {this.name = name;this.age = age;this.score = score;}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 Score getScore() {return score;}public void setScore(Score score) {this.score = score;}
}class Score implements Serializable{private int math;private int english;private int chinese;private String grade;public Score(int math, int english, int chinese) {this.math = math;this.english = english;this.chinese = chinese;if(math>=90 && english>=90 && chinese>=90){this.grade = "A";}else if(math>=80 && english>=80 && chinese>=80){this.grade = "B";}else {this.grade = "C";}}public int getMath() {return math;}public void setMath(int math) {this.math = math;}public int getEnglish() {return english;}public void setEnglish(int english) {this.english = english;}public int getChinese() {return chinese;}public void setChinese(int chinese) {this.chinese = chinese;}public String getGrade() {return grade;}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85

MainActivity.java

public class MainActivity extends AppCompatActivity {EditText editTextName,editTextAge,editTextMath,editTextEnglish,editTextChinese;Button buttonSave,buttonLoad;TextView textViewGrade;//定义文件名为一个常量private static final String FILE_NAME = "myfile.data";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);/*引入一个错误,观察try catch的机制int x = 5;//除以0是算数上的一个错误,应用程序会马上崩溃闪退try {x = x / 0;//  错误类型为算数错误}catch (ArithmeticException e){Log.e("calError", "onCreate: "+e);}*/editTextName = findViewById(R.id.name);editTextAge = findViewById(R.id.age);editTextMath = findViewById(R.id.math);editTextEnglish = findViewById(R.id.eng);editTextChinese = findViewById(R.id.chinese);buttonSave = findViewById(R.id.button);buttonLoad = findViewById(R.id.button2);//之前因为缺少这一句,导致对象没有实例化所以软件闪退textViewGrade = findViewById(R.id.textView);buttonSave.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//点击保存后,创建变量,对象保存数据int math = Integer.valueOf(editTextMath.getText().toString());int english = Integer.valueOf(editTextEnglish.getText().toString());int chinese = Integer.valueOf(editTextChinese.getText().toString());Score score = new Score(math,english,chinese);String name = editTextName.getText().toString();int age = Integer.valueOf(editTextAge.getText().toString());Student student = new Student(name,age,score);try {//将对象序列化写入到文件中,借助下面这个接口,针对应用程序而言,是输出,输出到文件中//                                               第一个参数是文件的名称,第二个是读写的模式(这里选择覆盖)ObjectOutputStream objectOutputStream = new ObjectOutputStream(openFileOutput(FILE_NAME,MODE_PRIVATE));//把对象写入文件objectOutputStream.writeObject(student);objectOutputStream.flush();//清空缓冲区objectOutputStream.close();Toast.makeText(MainActivity.this,"data saved!",Toast.LENGTH_SHORT).show();//sava之后把页面数据清空用来呈现load的数据editTextChinese.getText().clear();editTextEnglish.getText().clear();editTextMath.getText().clear();editTextName.getText().clear();editTextAge.getText().clear();textViewGrade.setText("-");//抓住的错误类型为IOException}catch (IOException e){//这里不做其他处理,仅观察Log.e("IO", "IO error " , e);}}});//读取,反系列化buttonLoad.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {try {ObjectInputStream objectInputStream = new ObjectInputStream(openFileInput(FILE_NAME));//                类型强制转换为Student类Student student = (Student)objectInputStream.readObject();//对象重建显示在页面上editTextName.setText(student.getName());editTextAge.setText(String.valueOf(student.getAge()));editTextMath.setText(String.valueOf(student.getScore().getMath()));editTextEnglish.setText(String.valueOf(student.getScore().getEnglish()));editTextChinese.setText(String.valueOf(student.getScore().getChinese()));textViewGrade.setText(student.getScore().getGrade());} catch (IOException | ClassNotFoundException e) {Log.e("IO", "onClick: ", e);}}});}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94

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

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

相关文章

极路由4刷机

准备工作 https://www.right.com.cn/forum/thread-161906-1-1.html https://breed.hackpascal.net/ 在第二个链接里下载路由器对应的breed固件,固件的说明见第一个链接,下文以极路由4为例演示 由于极路由官方挂了,无法进行root&#xff0…

评论安装_评论送|机电安装监理质量控制要点130页

来源:网络整理, 如有侵权请联系删除因本文篇幅有限,只能展示60页,全部130页需要您对本文进行精彩评论或者转发分享,加微信dahe0608送给您本文的ppt原件因本文篇幅有限,只能展示60页,全部130页需…

积跬步-java任职要求

2019独角兽企业重金招聘Python工程师标准>>> 1.JAVA基础扎实,熟悉io、多线程、集合等基础框架,熟悉分布式、缓存、消息、搜索等机制; 2.四年以上使用java进行web开发的经验,熟练使用spring 、MVC等框架,熟悉…

安卓APP_ 控件(11)webView —— 简单应用:显示网页

摘自:安卓APP_ 控件(11)webView —— 简单应用:显示网页 作者:丶PURSUING 发布时间: 2021-05-11 11:50:52 网址:https://blog.csdn.net/weixin_44742824/article/details/116602469 目录 简单了…

QT应用开发基础

目录前言Windows上搭建开发环境C基础什么是C什么是面向对象,什么又是面向过程c的灵魂:c的类对象:类的实例化怎么访问类的成员类的函数成员类的访问修饰符函数的重载构造函数和析构函数类的继承虚函数和纯虚函数制作一个简单的QT界面创建工程U…

meson构建系统

简介 Meson是一个构建系统,它被设计成在不牺牲性能的前提下尽可能的友好。这方面的主要工具是用户用来描述构建结构的自定义语言。这种语言的主要设计目标是简单、清晰和简洁。很多灵感都来自于Python编程语言,它被认为是非常易读的,即使对以…

射灯安装方法图解_江苏天筑不锈钢雕塑厂家格栅射灯安装方法,格栅射灯安装注意事项...

格栅射灯安装方法,您是否已经学会了呢?不管您会不会,今天江苏天筑不锈钢雕塑厂家就结合这个问题,一起来为大家详细介绍这部分内容的一些相关的注意事项,南方的天气比较潮湿,所以我们尽量不要把格栅射灯安装…

ARM体系结构简介 —— 迅为

目录单片机和ARM处理器内存管理单元(MMU)高速缓冲存储器(CACHE)指令集ARM的指令系统ARM处理器工作模式ARM处理器的内部寄存器ARM处理器的异常ARM中断向量ARM架构的发展单片机和ARM处理器 内存管理单元(MMU)…

网口扫盲二:Mac与Phy组成原理的简单分析(转)

1. general 下图是网口结构简图.网口由CPU、MAC和PHY三部分组成.DMA控制器通常属于CPU的一部分,用虚线放在这里是为了表示DMA控制器可能会参与到网口数据传输中. 对于上述的三部分,并不一定都是独立的芯片,根据组合形式,可分为下列三种方案: CPU集成MAC与PHY;CPU集成MAC,PHY采用…

设置git协议clone代理

0x0 最近在clone yaffs2仓库时发现clone的异常缓慢,就算开了代理也是,搜索一番发现网上大多都是将设置http、https、ssh协议的代理,对于git协定的代理讲的很少,下面分享下如何让git协议走socks代理 以下内容前提是里已经在电脑上…

vue-cli 3.0安装和使用

零. 前言 公司最近开发项目使用的是vue-cli 3.0版本开发,但是对于vue-cli 3.0版本一直没有研究过如何使用,公司使用配置:pug ts stylus eslint;编辑器使用:vscode,使用起来简直不要太爽。 默认你已经安装…

lucene 入门整理

2019独角兽企业重金招聘Python工程师标准>>> 1. 概述 Lucene是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎。Lucene以其方便使用、快速实施以及灵活性受到广泛的关注。它可以方便地嵌入到各种应用中实现针对应用的全文索引、检索功能&am…

安卓APP开发基础

目录安卓工程构建第一个APP运行安卓的工程目录文件夹介绍安卓APP启动过程安卓布局控件布局的种类布局和页面的关系显示一张美女图显示两个美女常用布局之相对布局基础控件之Button,TextView,EditText,ImageView, padding和margin(内外边框)相对布局综合小演练-智能家居刷卡界面…

jquery.ui.draggable中文文档jquery 自由拖拽类~study~

为什么80%的码农都做不了架构师?>>> JQuery UI Draggable插件用来使选中的元素可以通过鼠标拖动. Draggable的元素受影响css: ui-draggable, 拖动过程中的css: ui-draggable-dragging. 如果需要的不仅仅是拖, 而是一个完整的拖放功能, 请参阅JQue…

数据结构——二叉树先序、中序、后序及层次四种遍历(C语言版)

摘自:数据结构——二叉树先序、中序、后序及层次四种遍历(C语言版) 作者:正弦定理 发布时间:2020-12-09 17:08:48 网址:https://blog.csdn.net/chinesekobe/article/details/110874773?ops_request_misc%2…

js 获取td高度_JS或jQuery获取宽高度

javascript//网页可见区域宽: document.body.clientWidth //网页可见区域高: document.body.clientHeight //网页可见区域宽: document.body.offsetWidth (包括边线的宽) //网页可见区域高: document.body.offsetHeight (包括…

一些比较少用但比较有用的linux命令备忘

网络相关 ssh 反向代理 ssh -fCNR 10000:localhost:22 userBB.B.B.B B.B.B.B是一个外网机器B的IP ssh -p 10000 userAlocalhost 在机器B,ssh到机器A 防火墙 查看防火墙服务状态 systemctl status firewalld查询端口是否开放 firewall-cmd --query-port8080/tcp…

安卓网络编程(Socket、WebView控件)

目录JavaSocket服务端开发JavaSocket客户端开发安卓Socket客户端开发接收消息显示到控件上(解决安卓线程无法修改控件问题)Android网络接收数据并刷新界面显示安卓webView智能家居你APP页面开发JavaSocket服务端开发 import java.io.IOException; import java.io.InputStream; …

(转)iOS Wow体验 - 第五章 - 利用iOS技术特性打造最佳体验

本文是《iOS Wow Factor:Apps and UX Design Techniques for iPhone and iPad》第五章译文精选,其余章节将陆续放出。上一篇:Wow体验 - 第四章 - 为应用的上下文环境而设计 关于本套译文分享的详情及目录结构,请参考iOS Wow体验 - 译文分享说…