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

2023-11-10

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

    @Override
    protected 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() {
            @Override
            public 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() {
            @Override
            public 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

序列化与反序列化(1)Serializable —— Java原生态方法 的相关文章

随机推荐

  • php exec ctf,[CTF_web]exec/exec1.php

    CTF web 源码如下 Get input target REQUEST ip var dump target target trim target var dump target Set blacklist substitutions
  • Java 形参与实参

    转自 https dailycast github io Java 形参与实参 前几天在头条上看到一道经典面试题 引发了一些思考 也是写这篇文章的导火索 背景 请看题 public class Main public static void
  • 程序结构(顺序结构、选择结构、循环结构)

    程序结构 在C语言程序里 一共有三种程序结构 顺序结构 选择结构 分支结构 循环结构 1 顺序结构 按照实物本身特性 必须一个接着一个来完成 2 选择结构 到某个节点后 会根据一次判断结果来决定之后走哪一个分支 3 循环结构 循环结构有一个
  • 使用python脚本批量对gprmax建模(用不同含水量、rebar半径、rebar深度)

    1 软件 1 spyder 2 Gprmax 2 代码及解释 1 首先在spyder中编辑好python部分代码 代码如下 主要是确定含水量 半径 深度三个部分 随机生成需要的范围内的数据 import scipy interpolate
  • stm32通道

    什么是通道 通道是一个计算机词汇 属于操作码 记数段 内存地址段等 能够完成内存与外设之间数据的传输 传输信息的数据通路 计算机系统中传送信息和数据的装置 主要有主存储器读写通道和输入 输出通道 能接收中央处理机的命令 独立执行通道程序 协
  • Python3,掌握这几种并行处理,轻轻松松提升for循环速度。

    并行处理几种方法 1 引言 2 并行处理 2 1 定义 2 2 并行处理优缺点 2 3 并行处理的常用库 2 4 代码示例 2 4 1 multiprocessing 2 4 2 concurrent futures 2 4 3 jobli
  • Linux环境搭建 JDK,简单超级实用

    Linux环境搭建 JDK 一 将下载的linux版本jdk 解压 解压命令 tar zxvf 文件名 二 配置环境变量 1 用vim编辑器打开profile文件 gt vim etc profile 并在配置文件末尾加上环境变量配置 如下
  • css 网格布局_CSS网格布局:Fr单元

    css 网格布局 介绍 Introduction With CSS Grid Layout we get a new flexible unit the Fr unit Fr is a fractional unit and 1fr is
  • C# GET方式请求时url地址长度超过限制问题解决

    问题分析 一般通过Get方式请求 服务器只能接受url长度不超过2048个字节的请求 问题解决 我们可以将服务器能够接受的最大请求长度设置为100MB 在Web config文件中添加以下配置
  • 自定义MVC框架原理

    目录 一 什么是MVC 1 模型 Model 2 视图 View 3 控制器 Controller 二 自定义mvc核心思想 三 自定义MVC的核心原则 四 三层架构和MVC的区别 1 结构层次不同 2 重点关注不同 3 强调的功能不同 4
  • install Android Studio 1.3 —— VM Acceleration on Linux

    http developer android com tools devices emulator html vm linux Configuring VM Acceleration on Linux Linux based systems
  • 堪称全网最详细的Java八股面试文,面试必备(附答案)

    前言 听一些小伙伴说 近期的面试越来越难了 为了帮大家节约时间 给大家搞来了今年上半年碰到的大厂Java面试题合集 内容非常的全面 耗时半月 终于把牛客网上的互联网大厂Java面试八股文整理成了PDF合集 其中概括的知识点有 java基础
  • virtualenv创建“隔离”的Python运行环境

    Windows 安装mkvirtualenv pip install virtualenv pip install virtualenvwrapper 新建虚拟python环境 1 创建python工程目录 2 创建一个独立的Python运
  • OpenCV教程——Mat对象

    1 Mat对象和IplIamge对象 Mat对象是OpenCV2 0之后引进的图像数据结构 自动分配内存 不存在内存泄漏的问题 是面向对象的数据结构 分为两个部分 头部和数据部分 IplIamge是从2001年OpenCV发布之后就一直存在
  • SpringBoot自学笔记《黑马程序员》

    SpringBoot 文章目录 SpringBoot SpringBoot简介 SpringBoot开发步骤 SpringBoot配置文件 属性配置 YAML格式 YAML读取 多环境配置 配置文件级别 SpringBoot整合junit
  • 20230822 Windows上使用find_package引入OpenCV报错

    报错信息 打开Cmake项目时 find package 报错 Found OpenCV Windows Pack but it has no binaries compatible with your configuration You
  • chipsel语言_未来发行版中可能删除的功能

    未来发行版中可能删除的功能 未来的 Oracle Solaris 软件发行版可能不支持以下功能 LP 打印服务 未来的 Oracle Solaris 发行版可能不包含 LP 打印服务 SPARC 对传统系统的支持 未来的 Oracle So
  • 【华为 OD】

    目录 一 题目描述 二 输入描述 三 输出描述 用例 四 题目解析 五 Java玩法 六 JavaScript玩法 一 题目描述 给定一组数字 表示扑克牌的牌面数字 忽略扑克牌的花色 请按如下规则对这一组扑克牌 进行整理 步骤 1 对扑克牌
  • 备份技术

    备份技术 备份技术是灾难恢复技术的一个基础 没有使用备份技术进行全面 及时以及准确的备份 就无法进行灾难恢复 1 备份策略 备份策略的制定是备份系统的一个重要部分 备份策略的选择依赖于数据的重要性 允许备份的可用时间以及其他的一些因素 一般
  • 序列化与反序列化(1)Serializable —— Java原生态方法

    摘自 序列化与反序列化 1 Serializable Java原生态方法 作者 丶PURSUING 发布时间 2021 05 08 19 20 21 网址 https blog csdn net weixin 44742824 articl