Android API—序列化与反序列化学习+案例

news2024/11/20 2:32:47

概述

序列化是指将对象的状态信息转换为可以存储或传输形式的过程.在序列化期间,对象将其当前状态写入到临时或持久性存储区.以后可以通过从存储区中读取或者反序列化对象的状态,重新创建该对象.

  • 序列化:利用ObjectOutputStream,把对象的信息,按照固定的格式转成一串字节值输出并持久保存到磁盘
  • 反序列化:利用ObjectInputStream,读取磁盘中之前序列化好的数据,重新恢复成对象

特点/应用场景

  • 需要序列化的文件必须实现Serializable接口,用来启用序列化功能
  • 不需要序列化的数据可以修饰成static,原因:static资源属于类资源
  • 不随着对象被序列化输出 每一个被序列化的文件都有一个唯一的id,如果没有添加此id,编译器会自动根据类的定义信息计算产生一个
  • 在反序列化时,如果和序列化的版本号不一致,无法完成反序列化
  • 常用与服务器之间的数据传输,序列化成文件,反序列化读取数据
  • 常用使用套接字流在主机之间传递对象
  • 不需要序列化的数据也可以被修饰成transient(临时的),只在程序运行期间在内存中存在,不会被序列化持久保存

涉及到的流对象

序列化:ObjectOutputStream ObjectOutputStream 将 Java 对象的基本数据类型写入 OutputStream,通过在流中使用文件可以实现对象的持久存储。如果流是网络套接字流,则可以在另一台主机上或另一个进程中重构对象。

构造方法: ObjectOutputStream(OutputStream out) 创建写入指定 OutputStream 的 ObjectOutputStream 普通方法: writeObject(Object obj) 将指定的对象写入 ObjectOutputStream

反序列化:ObjectInputStream ObjectInputStream对以前使用ObjectOutputStream写入的基本数据和对象进行反序列化重构对象。

构造方法: ObjectInputStream(InputStream in) 创建从指定 InputStream 读取的 ObjectInputStream 普通方法: readObject() 从 ObjectInputStream 读取对象

序列化 ObjectOutputStream

将内存上所产生的对象保存到一个文本文件中

所有要序列化的类都必须实现Serializable接口

 Student implements Serializable{

      private static final long serialVersionUID = 1L;

}

反序列化 ObjectInputStream

将本地文件中的内容(对象)–读取到内存上

基本格式:

序列化

        准备一个对象
        Student stu = new Student(1, "沪青棒");
        File file = new File("D:\\stu.bak");
        FileOutputStream fos = new FileOutputStream(file);
        通过序列化流进行写入ObjectOutputStream
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        通过序列化流写入一个对象
        oos.writeObject(stu);
        关闭
        oos.close(); 

        fos.close();

【序列化:Serializable】

有一个具体的类对象,它用于保存程序运行过程中,产生的数据。 目前它是在内存上的,程序一旦结束就没有了。 有么有可能,它运行过程中的类,包括里面的数据,保存下来。 下一次运行程序的时候,拿出来,继续操作。

把这个运行过程中的类及数据,保存成一个文件。

要使用的时候再读取出来。

【对象序列化】:

将一个有数据的类信息,写成一个文档,保存到硬盘上。

序列化的条件:

如果一个类对象,需要被序列化操作的,它不能是普通的类, 它必须是:Serializable 的实现类

import java.IO.Serializable;

public class 类 implements Serializable{}

【反序列化】:

把那个硬盘上的文件,读取到程序中,回到内存上变成类对象。

程序必须有原始的类对象文件:

序列后的生成的文件,它主要是运行过程中的数据。

反序列化的时候,把文件中的数据读取出来,通过 serialVersionUID去对应类

然后:实例化类,填入数据,恢复到内存上。

其中:

transient:修饰符: 正常使用,但是禁止序列化(序列化会忽略) 都是给属性使用的。

对象流:建立在基础的字节流之上【用于序列化】 ObjectInputStream ObjectOutputStream

序列化的实例:

1、首先创建一个需要被实例化的类,然后implements Serializable类

package com.xzm.test;

//导入序列化操作的接口包文件
import java.io.Serializable;

//自定义:用于的数据实体模型类
//没有行为,只有属性,用于存取数据
//需要 序列化的,
public class User implements Serializable {

    //serialVersionUID:这个属性是固定的
    //用户可以自定义它的值,long类型
    //如果不写,程序会默认自动创建
    //这个属性是提供程序把文件读取出来以后,转换成指定的类的一个对应成
    //主要就是用于判断,转换的是不是同一个类
    //【通常不用自定义,程序自动填充】---> 提示中选择第二项,分配
    private static final long serialVersionUID = 3050851876068541840L;

    //普通的属性及封装属性【会序列化】
    private int id;       //变量
    private String name;  //类对象
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

    //可以定义构造函数的,因为是特殊方法,不是行为
    public User(int id, String name) {
        this.id = id;
        this.name = name;
    }

    //--------------------------------------------
    // transient:修饰符
    // 用于序列化,表示 暂时的
    // 正常操作没有问题,内存上与普通的一样,
    // 但是,它不会被序列化到物理文件中
    public transient int age = 28;

}

2、将上面的User类实例化操作

package com.xzm.test;

import java.io.File;
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;

public class 序列化User {

    public static void main(String[] args) {

        //强制异常处理
        try {

            //第一步:
            // 定义File对象,定义目标源。
            // 内存数据写成文件,通常是不允许直接打开预览的
            // 大部分应用程序是写后缀,
            // 游戏类的会自定义名称, 
            // 标准开发的时候,推荐:  .es
            File f = new File("C:/aaa/User.es");

            //第二步:创建 基础 字节 输出流
            FileOutputStream fos = new FileOutputStream(f);

            //第三步:
            // 创建高层 对象 输出 流
            ObjectOutputStream oos = new ObjectOutputStream(fos);

            //操作对象--->在内存
            User u = new User(555, "张三");

            //第四步:写文件,生成序列化文档
            oos.writeObject(u);

            //关闭
            oos.close();
            fos.close();

            //提示:
            System.out.println("保存成功!");

        }
        catch(Exception ex) {
            ex.printStackTrace();
        }

    }

}

此时通过上面两步,已经将User类实例化了,现在再将它反序列化

package com.xzm.test;

import java.io.File;
import java.io.FileInputStream;
import java.io.ObjectInputStream;

public class 反序列化es {

    public static void main(String[] args) {

        try {            

            //【反序列化】:把物理文件,恢复到内存

            //第一步:(目标源)
            File f = new File("C:/aaa/User.es");

            //第二步:基础 字节 输入流
            FileInputStream fis = new FileInputStream(f);

            //第三步:高层对象输入流
            ObjectInputStream ois = new ObjectInputStream(fis);

            //第四步:
            // 调用方法,读取文件,得到一个Object对象
            // 文件读取到系统中,都是一个Object
            Object obj = ois.readObject();

            //第五步:
            //转换类型,把对象转换成所对应的类
            //这时,会判断: serialVersionUID 是否一样
            User u = (User)obj;

            //关闭
            ois.close();
            fis.close();

            //============================================

            System.out.println(u.getId());

            System.out.println(u.getName());

        }
        catch(Exception ex) {
            ex.printStackTrace();
        }

    }

}

文章到这差不多结束了,有关Android中的APT知识。可以查看《Android核心技术》这本电子文档。里面记录的很详细,还有Android中更多的核心技术笔记资料。需要进阶自己技术的朋友可以参考学习,点击查看免费方法。

总结

序列化与反序列化的操作,一帮用于单机程序的配置保存,特别是哪些单机的应用程序,游戏,都是这个操作。

  • 应用程序:配置文件
  • 游戏: 配置文件,存档

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

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

相关文章

论文笔记: 数据驱动的地震波形反演--健壮性与泛化性研究

摘要: 分享对论文的理解, 原文见 Zhongping Zhang and Youzuo Lin, Data-driven seismic waveform inversion: A study on the robustness and generalization. 1. 论文贡献 提供实时预测的 VelocityGAN与其他基于编码器-解码器的数据驱动地震波形反演方法不同, VelocityGAN …

c++ - 第11节 - stack和queue类

1.标准库中的stack类 1.1.stack类 stack类的文档介绍:https://cplusplus.com/reference/stack/stack/?kwstack 注: 1. stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提…

深度学习项目:男女性别识别【附完整源码】

性别分类对于人机交互应用和计算机辅助生理或心理分析等商业领域的许多应用至关重要,因为它包含有关男女特征差异的广泛信息。 本次案例收集了接近二十万的男女数据集图片。 文章目录性别分类简介使用 Python 进行性别分类的机器学习项目导入相关库和数据模型搭建…

Chapter3 Pytorch与机器学习有关函数(一)

3.1 Tensor中统计学有关的函数 3.1.1 平均值、总和 、累积 1.测试结果1 import torcha torch.rand(2, 2)print(a) print(torch.mean(a,)) print(torch.sum(a)) print(torch.prod(a)) 2.测试结果2:数组对第1维操作 import torcha torch.tensor([[1.0,2.0,3.0],[4.…

【毕业设计】酒店评价情感倾向分析系统 - python 深度学习

文章目录0 前言1 概述2 项目所需模块3 数据3.1 数据说明3.1.1 字段说明3.2 数据处理3.2.1 分词处理3.2.3 停用词处理3.2.4 样本均衡3.2.5 建立多层感知机分类模型3.2.6 训练模型3.2.7 网络检测率以及检测结果4 最后0 前言 🔥 Hi,大家好,这里…

回归模型介绍

Datawhale开源学习,机器学习课程,项目地址:https://github.com/datawhalechina/leeml-notes 首先讲机器学习中的:回归,回归Regression可以做哪些东西呢? 股票预测 输入为以往股票走势,预测未来…

HTML标签(下)

一、表格标签 1. 表格的主要作用 表格主要用于显示、展示数据。可以让数据规整、有可读性、有条理。 2. 表格的基本语法 <table><tr><td>单元格内的文字</td>...</tr>... </table><table> </table>是用于定义表格的标签 …

nodejs+vue+elementui零食食品o2o商城系统

目 录 摘 要 1 Abstract 1 1 系统概述 4 1.1 概述 4 1.2课题意义 4 1.3 主要内容 4 2 系统开发环境 5 3 需求分析 7 3.1技术可行性&#xff1a;技术背景 7 3.2经济可行性 7 3.3操作可行性&#xff1a; 8 3.4系统设计规则 8 3.5…

对pure pursuit算法的理解和改进

算法实现 purepursuit的核心其实是一个曲率半径的几何计算。 (x, y)是转换到机器人坐标系上的路径点。L是lookahead distance。r是形成的圆弧半径。D是r和x之间的差值。 根据上面的图形&#xff0c;可以发现有下面的几何关系&#xff1a; 同时通过 y2D2r2y^2 D^2 r^2 y2D2r…

java项目-第134期ssm社团管理系统-java毕业设计

java项目-第134期ssm社团管理系统-毕业设计 【源码请到资源专栏下载】 今天分享的项目是《社团管理系统》 该项目分为前台和后台。主要分成两个角色&#xff1a;普通用户、管理员角色。 普通用户登录前台&#xff0c;看到社团官网发布的一些信息。 比如&#xff1a;首页、新闻…

如何在 .NET MAUI 中加载 json 文件?

引言: 按core传统方式添加 AddJsonFile(“appsettings.json”) 在windows平台和ssr工作正常,但是在 ios 和 android 无法用这种方式,因为资源生成方式不一样. 使用内置资源方式不够灵活而且 ios 平台会提示不能复制 json 文件到目录,于是进行了几天的研究,终于能正确使用了. 资…

1-STM32之GPIO点亮LED

我们在基础部分讲了有关GPIO的方面&#xff0c;从这章开始我们进入模块的讲解&#xff0c;从最开始的LED灯到各种传感器模块进行。专栏预计25个章节。后续可能会不定时的增加。 本专栏芯片为STM32F429 对于工程的移植和新建这里不做讲解&#xff0c;对工程建立不懂得&#xff0…

Vue3 - watch 侦听器(超详细使用教程)

前言 它之所以叫侦听器呢&#xff0c;是因为它可以侦听一个或多个响应式数据源&#xff0c;并在数据源变化时调用所给的回调函数。 大白话说呢&#xff0c;就是你传给 watch 侦听器一个响应式变量&#xff0c;然后当这个变量变化时&#xff0c;自动触发一个你定义的函数&#x…

超实用Word小技巧,常用但很少有人记得住

我们在日常工作中经常使用 Word 进行办公。以下常用Word提示可以为您的工作节省时间和精力&#xff0c;让我们来看看。 技巧一&#xff1a;如何纵向复制文本我们一般水平选择文本&#xff0c;你有没有想过垂直选择文本&#xff1f;先按住【Alt】键&#xff0c;然后拖动鼠标左键…

【Python百日进阶-WEB开发】Day179 - Django案例:11短信验证码

文章目录九、短信验证码9.1 短信验证码逻辑分析9.2 容联云通讯短信平台9.2.1 容联云通讯短信平台介绍9.2.2 容联云通讯短信SDK测试9.2.2.1 美多商城meiduo_mall.apps.verifications.libs中新建yuntongxun包&#xff0c;结构如下&#xff1a;9.2.2.2 ccp_sms.py代码9.2.2.3 CCPR…

一起来庆祝属于GISer的节日GIS DAY!

01 概述 作为一名GISer的你&#xff0c;有没有想过其实我们GISer也有自己的节日&#xff1f;这个节日便是GIS DAY&#xff0c;今年的GIS DAY恰在今天&#xff08;2022年11月16日&#xff09;。究竟什么是GIS DAY&#xff1f;这里为大家介绍一下这个节日。 02 什么是GIS DAY …

vue的移动端项目打包成手机的app软件apk格式

目录 前提准备&#xff1a; 1、vue项目npm run build打包成dist文件夹 2、注册hbuilderx账号&#xff0c;获取appid 步骤 一、创建h5app空模版 二、 将打包完成生成dist文件目录复制到新建的项目里 三、检测打包的index.html是否白屏 四、 配置manifest.js应用入口页面…

作为项目经理必须具备的能力

作为项目管理者&#xff0c;每天都要应对项目中的所有问题&#xff0c;安排任务&#xff0c;还要照顾下属的情绪。管理者应该怎么做。 1、计划制定 项目经理作为项目管理者&#xff0c;需要制定计划&#xff0c;合理化分配任务。 项目经理可以使用甘特图制定项目计划&#xf…

微服务feign接口声明的3种方式使用与分析

前言 feign调用方式是微服务调用最为广泛的使用方式&#xff0c;feign接口声明位置也是比较关键的一环。目前来说&#xff0c;feign的3种接口声明方式各自存在利弊&#xff0c;并不存在最优解决方案&#xff0c;只能根据需求去选择。本文中不作详细项目搭建过程&#xff0c;但…

做3D建模的女生多吗?揭露行业比列

有&#xff0c;但是不多&#xff0c;这是常态✅ 其实就像是IT领域的男女比例一样&#xff0c;但是也不是没有。更何况现在女孩子顶半边天&#xff0c;遇到领导是女生的也不少&#xff0c;未来的情况如何也不能完全的预估。 • ❤️事业是热爱做的事&#xff0c;工作是不得不做…