摘自:序列化与反序列化(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

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

  1. 序列化与反序列化注意事项 java

    序列化与反序列化注意事项 java 序列化时,需要类实现一个接口 如果类的属性也是一个类,那么这个类也要实现序列化的接口 通过序列化id确保反序列化时不出问题 使用transient修饰属性,被修饰的 ...

  2. 一起谈.NET技术,C#序列化与反序列化(Serializable and Deserialize)

    序列化是指将对象实例的状态存储到存储媒体的过程.在此过程中,先将对象的公共字段和私有字段以及类的名称(包括类所在的程序集)转换为字节流,然后再把字节流写入数据流.在随后对对象进行反序列化时,将创建出与 ...

  3. Int类型数据的序列化以及反序列化(与Java服务器通讯预热)

    游戏前端,避免不了的跟服务器通讯,其实游戏的大部分逻辑都在服务端,并不在客户端,所以需要跟服务端通讯"协商"一些逻辑,既然通讯,就少不了的传输,传输之前又要序列化,这篇博客主要讲一 ...

  4. K:java中的序列化与反序列化

    Java序列化与反序列化是什么?为什么需要序列化与反序列化?如何实现Java序列化与反序列化?以下内容将围绕这些问题进行展开讨论. Java序列化与反序列化 简单来说Java序列化是指把Java对象转 ...

  5. Java基础-序列化和反序列化

    目录 1.序列化和反序列化概述 2.序列化 3.反序列化 4.序列化多个对象 5.序列化版本号(重要) 1.序列化和反序列化概述 1.java.io.NotSerializableException ...

  6. 【java笔记】序列化和反序列化

    序列化: 写对象,把对象以流的方法写入到文件中 反序列化:读对象把文件中保存的对象,以流的方式读取出来 序列化和反序列化时,会抛出NotSerializableException没有序列化异常 类通过 ...

  7. Java序列化与反序列化(一)

    目录 序列化与反序列化 1.最简单的使用:Serializable 接口 2. 序列化 ID 的问题 3. 静态字段不会序列化 4. 屏蔽字段:transient 5. 父类的序列化 6. 自定义序列 ...

  8. Java 序列化与反序列化

    Java 序列化与反序列化 文章目录 Java 序列化与反序列化 1 序列化与反序列化的概念 2 核心类与关键字总览 3 序列化与反序列化的过程 3 应用示例 4 序列化版本号的作用 serialVe ...

  9. Java对象序列化与反序列化

    什么是序列化与反序列化 当两个进程在进行远程通信时,彼此可以发送各种类型的数据.无论是何种类型的数据,都会以二进制序列的形式在网络上传送.发送方需要把这个Java对象转换为字节序列,才能在网络上传送: ...

最新文章

  1. 【短视频SDK - 参数解析】对焦模式、裁剪模式、视频质量、分辨率、视频比例、帧率、关键帧间隔等参数解析...
  2. linux cpuspeed irqbalance 进程 cpu占用过高
  3. 数据结构常见算法集锦
  4. 网易云信:要做就做轻量级、小而美的云产品
  5. ActiveMQ整合spring
  6. python 正则表达式过滤文本中的html标签 源代码解析
  7. 土木转计算机 但计算机学院不好,土木妹子转计算机,较高三维水科研,求指导!...
  8. Targeted Resumes How to Write a Targeted Resume By Alison Doyle
  9. 扫地机自动回充揭秘之科沃斯T8
  10. openvas-tutorial-for-beginners
  11. win10如何与终端电脑连接服务器,教程 | Windows 10 下在命令行窗口使用 ssh 连接服务器...
  12. Python核心编程第二版 第七章课后练习 7-6. 列表和字典
  13. PLC控制系统设计的基本内容
  14. python爬斗鱼直播房间名和主播名_谁才是斗鱼一哥?(用Python抓取斗鱼直播间信息)...
  15. 大小写金额转换html,小写金额转为大写金额JS代码怎么写呢?
  16. 小程序上传图片方法1(免搭建上传到小白接口免费服务器)
  17. perfect forward secrecy
  18. Mysql 备份工具XtraBackup全量备份
  19. 谷歌play商店_Google Play商店优化的17个技巧
  20. 人脸口罩识别的项目总结

热门文章

  1. Python多线程豆瓣影评API接口爬虫
  2. 删除win10自带的软件
  3. 利用VOIP电话通信服务,他骗得18亿美元
  4. ios CGRec用法
  5. Halcon:Image、region、xld常用的处理
  6. Hi3559AHi3519AHi3556A规格对比
  7. 一段H264数据的分析
  8. 【Python函数】——sort,sorted
  9. python轮廓函数的使用
  10. 关于FCN的数据集着色说明