android 面试题 Parcelable与Serializable区别

IPC机制与面试题精选《Android开发艺术探索》笔记 文章目录IPC简介IPC的概念进程与线程的区别多进程的情况 IPC简介 IPC的概念 Inter-Process Communication的缩写。含义为进程间通信或跨进程通信,是指两个进程之间进行数据交换的过程。 进程与线程的区别 线程是CPU调度的最小单元,同时线程是一种有限的资源。 进程一般指一个执行单元,一个进程可以包含多个线程,所以他们之间是包含与被包含的关系。(比如Android中有... 阅读详情

一、序列化与反序列化

由于在系统底层,数据的传输形式是简单的字节序列形式传递,即在底层,系统不认识对象,只认识字节序列,而为了达到进程通讯的目的,需要先将数据序列化,而序列化就是将对象转化字节序列的过程。相反地,当字节序列被运到相应的进程的时候,进程为了识别这些数据,就要将其反序列化,即把字节序列转化为对象。有了以上理解,接下来我们认识两个用于序列化和反序列化的接口:java原生的Serializable接口和android实现的Parcelable接口

二、Serializable接口

Java提供了一个序列化接口,Serialable接口,是一个空接口,仅仅提供了标志功能,具体的序列化与反序列化操作是由ObjectOutputStream和ObjectInputStream完成的。继续读文档,发现该接口要求我们在实现了该接口的类中声明如下的一个变量

private static final long serialVersionUID= 1L; 

这个变量有什么用呢?试想一下,如果没有手动指定该值,一开始序列化了classA,得到文件A,接着对classA的内部结构更改,比如添加了一个新的变量,那么此时反序列化则会失败,因为实际上系统在序列化的时候,会自动计算出一个serialVersionUID值,并保存在已经序列化好的数据中,此时修改了classA,那么反序列化的时候系统就会重新计算一个新的serialVersionUID值,那么两个值就会不相等,就会反序列化失败。所以,手动指定一个值,能很大程度上保存数据,防止数据丢失。

序列化和反序列化的具体步骤

(1)实例化一个对象输出流:ObjectOutputStream,该对象输出流可以包装一个输出流,比如文件输出流。

(2)使用ObjectOutputStream.writeObject(obj)进行写对象。   

  (3)实例化一个对象输入流:ObjectInputStream,该对象输入流可以包装一个输入流,比如文件输入流。

(4)使用ObjectInputStream.readObject(obj)进行读对象。

比如对User类进行序列化和反序列化

public class User implements Serializable {
    private static final long serialVersionUID = 1L;
    private int age;
    private String name;
    public User(int age, String name) {
        this.age = age;
        this.name = name;
    }
    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

 测试类

public class UserTest {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        //实例化User类
        User user =new User(18,"zhouguizhi");
        //序列化过程
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("test.txt"));
        objectOutputStream.writeObject(user);
        objectOutputStream.close();
        System.out.println("序列化成功!");
        //反序列化过程
        ObjectInputStream objectInputStream =new ObjectInputStream(new FileInputStream("test.txt"));
        User newUser = (User) objectInputStream.readObject();
        objectInputStream.close();
        System.out.println("反序列化成功!");
        System.out.println("age:"+newUser.getAge()+"  name:"+newUser.getName());
    }
}

结果:

序列化成功!
反序列化成功!
age:1  name:zhouguizhi

反序列化的对象和原对象是不同的,通过他们之间的hashCode()方法就能对比出来,

静态成员变量属于类,而不是对象,所以不会参与序列化;使用transient关键字标记的成员变量不参与序列化过程

三、Parcelable接口

接下来我们要说的是Parcelable接口,该接口是Android提供的新的序列化方式。首先,先看官方文档对该接口的描述:Interface for classes whose instances can be written to and restored from a Parcel. Classes implementing the Parcelable interface must also have a static field called CREATOR, which is an object implementing the Parcelable.Creator interface.   除了实现该接口的方法外,还需创建一个名叫CREATOR的静态对象,该对象实现了一个Parcelable.Creator的匿名内部类。以下是官方文档的一个类实现Parcelable接口的典型例子

public class MyParcelable implements Parcelable {
    private int age;
    protected MyParcelable(Parcel in) {
        age = in.readInt();
    }

    @Override
    public void writeToParcel(Parcel out, int flags) {
        out.writeInt(age);
    }

    @Override
    public int describeContents() {
        return 0;
    }

    public static final Creator<MyParcelable> CREATOR = new Creator<MyParcelable>() {
        @Override
        public MyParcelable createFromParcel(Parcel in) {
            return new MyParcelable(in);
        }

        @Override
        public MyParcelable[] newArray(int size) {
            return new MyParcelable[size];
        }
    };
}

下面介绍一下以上各个方法的作用: 

1:writeToParcel(Parcel out,int flags):将当前对象写入序列化结构之中

2:createFromParcel(Parcel in):从序列化后的对象中创建原始对象

3:newArray(int size):创建指定长度的原始对象数组 

4:MyParcelable(Parcel in):从序列化后的对象中创建原始对象

由以上各个方法可知,writeToParcel方法负责将对象序列化,而CREATOR负责数据的反序列化,只要你的类实现了Parcelable接口,并实现以上方法,那么就能自动地对对象进行序列化和反序列化了。  注意:在writeToParcel方法中,调用了out.writeInt(data)方法,如果当前类有多个属性,在MyParcelable(Parcel in)反序列化的顺序要和序列化的顺序保持一致

即顺序应该一一对应,否则,取出来的数据将会出错,这是IPC机制中比较基础的概念

四 Parcelable和Serializable的区别

 a:对象为什么需要序列化 1.永久性保存对象,保存对象的字节序列到本地文件。 2.通过序列化对象在网络中传递对象。 3.通过序列化对象在进程间传递对象。

b:当对象需要被序列化时如何选择所使用的接口 1.在使用内存的时候Parcelable比Serializable的性能高。 2.Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC(内存回收)。

c: Parcelable不能使用在将对象存储在磁盘上这种情况,因为在外界的变化下Parcelable不能很好的保证数据的持续性

猿辅导Android开发面试题及参考答案(上) Android 四大组件是 Activity、Service、BroadcastReceiver、ContentProvider,它们是 Android 应用的核心组成部分,各自承担不同职责,通过 Intent 机制协同工作,构成完整的应用功能。 阅读详情

相关推荐

Android Parcelable与Serializable详解及区别

主要介绍了Android Parcelable与Serializable详解及区别的相关资料,需要的朋友可以参考下

Parcelable 和 Serializable的区别和使用

序列化:为了保存在内存中的各种对象的状态,并可以把保存的对象的状态读出来。一、Seralizable介绍:1.Serializable 是java的序列化技术,最简单的使用方式为在需要序列化的class增加implements Serializable,并增加一个唯一个序列化id: private static final long serialVersionUID = 1L; 默认方式最好直接设...

hacker_crazy的专栏 2万+

DCDC开关节点SW的Layout抉择:打孔换层与EMI共模辐射的权衡

本文深入探讨了DCDC转换器中开关节点SW的Layout设计对EMI共模辐射的影响。通过分析SW节点的EMI辐射机制、打孔换层对输入环路的影响以及铜皮面积与共模辐射的量化关系,提出了工程实践中的权衡策略和优化方法,帮助工程师在设计中平衡EMI性能和电路效率。

weixin_29722783的博客 245

parcelable与Serializable的区别

1.性能不同 parcelable性能好于 serializable 2.实现复杂度不同 parcelable 代码多点,serialzable比较简单 3.数据持久化 parcelable一般放到内存,serialzable一般可以放到文件 ...

perfectnihil的博客 897

方法二:旋转机械动平衡精度计算

本文以实际案例为基础,系统阐述基于ISO 1940标准的动平衡精度G GG等级计算方法。通过角速度转换、许用剩余不平衡量e p e r e_{per}e per ​ 推导及G GG等级公式应用,结合惯性力偶矩、转子质量等参数,得出某转子系统的动平衡精度为G 40 G40G40。文中详细解析了公式原理与参数单位转换要点,并附完整ISO 1940动平衡等级参考表,为工程师提供从理论到实践的完整解决方案。研究结果表明,该方法可有效量化旋转机械的平衡精度,适用于风机、泵类等中低速设备的设计与调试,对提升设备运行

weixin_46153372的博客 920

接口操作MySQL跟MongoDB事务回滚问题

通常使用的事务注解:@Transactional 是不会对MongoDB生效的,但是在一些生产接口中无法避免同时使用MySQL跟MongoDB的操作。

weixin_45932023的博客 1578

Serializable 和Parcelable 的区别

1.编码上: Serializable代码量少,写起来方便 Parcelable代码多一些 2.效率上: Parcelable的速度比Serializable 高十倍以上 serializable的迷人之处在于你只需要对某个类以及它的属性实现Serializable 接口即可。Serializable 接口是一种标识接口(marker interface),这意味着无需实现方法,Java...

suncat的博客 622

【实战】Python 携程酒店价格实时抓取爬虫项目全解析

摘要:本文介绍了一个基于Python的携程酒店价格实时抓取系统开发方案。系统采用Requests、BeautifulSoup和Selenium等技术栈,实现了多城市、多日期的酒店数据采集,包括价格、评分、位置等关键信息。通过请求头伪装、IP代理、随机等待等反爬策略,有效应对携程的反爬机制。系统支持数据清洗、去重和CSV/Excel导出,并提供了多线程优化、代理池集成等进阶方案。本文详细阐述了技术原理、代码实现和优化策略,同时强调了数据采集的合法合规性,为旅游行业数据分析提供了可靠的数据获取方案。

2503_91057718的博客 2604

序列化Serializable 和Parcelable 的区别

序列化:将一个对象转换成可存储或可传输的状态,序列化后的对象可以在网络上传输,也可以存储到本地,或实现跨进程传输; 为什么要进行序列化:开发过程中,我们需要将对象的引用传给其他activity 或fragment使用时,需要将这些对象放到一个Intent 或Bundle 中,再进行传递,而Intent 或Bundle只能识别基本数据类型和被序列化的类型。 Serializable:表示将一个对象转换成可存储或可传输的状态。 Parcelable:与Serializable 实现的效果相同,也是将一个对象转换

siyuanwai的博客 752

深度学习100例-卷积神经网络(CNN)彩色图片分类 | 第2天

文章目录前期工作设置GPU导入数据标准化可视化构建CNN网络编译训练模型预测模型评估 前期工作 设置GPU 如果使用的是CPU可以忽略这步 import tensorflow as tf gpus = tf.config.list_physical_devices("GPU") if gpus: gpu0 = gpus[0] #如果有多个GPU,仅使用第0个GPU tf.config.experimental.set_memory_growth(gpu0, True) #设置GPU显存用量

“365天深度学习训练营”报名进行中~ 7853

电磁兼容(EMC)整改案例(七):EFT测试失败都是IC悬空引脚惹的祸

无论任何时候,为了避免这些问题,通常建议对悬空的IO口进行适当的配置,比如设置为强推挽输出低电平、输入带上拉或下拉电阻等,以减少外部电路对IO管脚状态的影响,并提高系统的稳定性和可靠性.

linkking27的博客 1032

Android面试题详解之序列Parcelable,Serializable的区别?

序列化操作时会把当前类的serialVersionUID写入到序列化文件中,当反序列化时系统会自动检测文件中的serialVersionUID,判断它是否与当前类中的serialVersionUID一致。如果一致说明序列化文件的版本与当前类的版本是一样的,可以反序列化成功,否则就失败。因此Parcelable实现序列化的原理就是将一个完整的对象进行分解,而分解后的每一部分都是基本数据类型或者其他实现了Parcelable/Serializable的类型,从而实现传递对象的功能。

Misdirection_XG的博客 210

45 - Android系统源码-crosvm 实战:基于 KVM 的 Rust 安全虚拟机监控器核心技术

摘要:crosvm 是 Google 开发的基于 KVM 的轻量级虚拟机监控器(VMM),采用 Rust 语言编写,专为 ChromeOS 和 Android 设计。其核心特点包括: 安全架构:通过 Rust 的内存安全特性和多进程隔离(每个设备运行在独立沙箱进程)大幅降低攻击面 性能优化:基于 KVM 的硬件虚拟化支持,结合异步 I/O (io_uring/epoll) 实现高效设备模拟 模块化设计:清晰的 trait 抽象层(Hypervisor/Vm/Vcpu)支持跨平台扩展 Android 集成

保持专注,保持热爱 225

最新Android-Parcelable和Serializable的区别(1),2024年最新android面试题2024高级

针对于上面的问题,我总结出了互联网公司Android程序员面试涉及到的绝大部分面试题及答案,并整理做成了文档,以及系统的进阶学习视频资料。(包括Java在Android开发中应用、APP框架知识体系、高级UI、全方位性能调优,NDK开发,音视频技术,人工智能技术,跨平台技术等技术资料),希望能帮助到你面试前的复习,且找到一个好的工作,也节省大家在网上搜索资料的时间来学习。网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

2401_84544854的博客 468

17、激光切割焦点位置和入射角对切割质量的影响研究

本研究通过响应面方法(RSM)结合Box-Behnken设计,系统分析了激光功率、切割速度和气体压力对SS 304不锈钢激光切割质量的影响,重点探讨了三种不同喷嘴在不同聚焦条件下的切缝比和条纹深度变化规律。实验结果表明,激光功率、切割速度和气体压力对切割质量具有显著影响,且不同喷嘴因焦点位置差异表现出不同的响应趋势。通过回归建模与优化,确定了最小激光功率、适中切割速度和最大气体压力为最优参数组合,可实现最小切缝比和较优条纹深度。研究为实际激光切割工艺提供了科学的参数选择依据和操作流程建议,有效提升了切割精度

mm9012的博客 124

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Android面试题整理,面试中Handler这些必备知识点你都知道吗?附超全教程文档

前言 又到了面试求职高峰期,最近有很多网友都在求大厂面试题。正好我之前电脑里面有这方面的整理,于是就发上来分享给大家。 这些题目是网友去百度、小米、乐视、美团、58、猎豹、360、新浪、搜狐等一线互联网公司面试被问到的题目。熟悉本文中列出的知识点会大大增加通过前两轮技术面试的几率。 网上的都是按照公司划分的,想找具体某一方面的知识点有点不好找,我这里就根据知识点分门别类的整理了一下,想看哪一块可以快速找到,希望可以帮助大家,祝大家求职顺利。 1、作用 Serializable的作用是为了保存对象的属性到本地

CHAMPION8888的博客 128

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

我在美团Android研发岗工作的那5年,含泪整理面经

这篇文章主要介绍了20道经典Handler题及答案解析,文中通过示例代码介绍的非常详细,对大家的学习或者面试复习具有一定的参考学习价值,内容过多可以先收藏慢慢观看,需要的朋友们下面随着小编来一起学习学习吧。 另外各位观众老爷觉得内容还可以的,请给个赞和评论,你的点赞和评论是我最大的动力,谢谢! 1、作用 Serializable的作用是为了保存对象的属性到本地文件、数据库、网络流、rmi以方 便数据传输,当然这种传输可以是程序内的也可以是两个程序间的。而Android的 Parcelable的设计初衷是.

m0_57081562的博客 148

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Android开发应该了解的Binder原理,建议收藏

开头 最近很多网友反馈:自己从各处弄来的资料,过于杂乱、零散、碎片化,看得时候觉得挺有用的,但过个半天,啥都记不起来了。其实,这就是缺少系统化学习的后果。 为了提高大家的学习效率,帮大家能快速掌握Android开发的各个知识点。为大家整理了一套系统的Android开发者进阶学习笔记。 这套资料不仅包含**【Android开发者系统核心知识笔记】还有【2021最新大厂面试真题集锦】**,共计2983页PDF,58万字。无法全部展示 PS:这是一个高质量的Android交流圈子,群内有许多来自一线的技术大牛,也

fanzhang_vip0723的博客 144

2024年失业后我整理了一份系统的Android面试题(含答案)

nTouchEvent 有什么区别,又该如何使用?View和ViewGroup分别有哪些事件分发相关的回调方法View刷新机制View绘制流程自定义控件原理自定义View如何提供获取View属性的接口?Android代码中实现WAP方式联网AsyncTask机制AsyncTask原理及不足如何取消AsyncTask?为什么不能在子线程更新UI?ANR产生的原因是什么?[外链图片转存中…(img-fRw1rQU5-1723361655505)]

2401_85833469的博客 409

onkeydown为什么会无限回调_这些Android面试题你还会做吗?

最近在给公司招聘3年以下经验的android开发人员,趁这个机会整理下一些基本的面试题,不是很多,我个人觉得比较典型的,时间长了一些不常用的细节问题都快忘记了,也许是轮子用多了吧,如果能在赶项目进度的时候抽出时间,总结回顾下一些知识,也是很不错的,没事的时候自己写写轮子,会有意想不到的收获。 招聘信息发出去很久了,居然没收到几份简历,当然薪资在行业内是具有竞争力的,...

weixin_39531374的博客 277

apm性能监控系统,Android开发岗还不会这些问题,真香

前言 金三银四,又是一年校招季。 经历过,才深知不易。最近,和作为校招面试官的同事聊了聊,问他们是如何去考察一个学生的,我简单归为以下几点: 聪明、反应快,这点自不必说,聪明意味着学习能力、适应力强,能够快速胜任工作。 算法不错,代码基本功好,这点其实考察的是算法能力和代码是否写得优雅。 基础过硬,技术岗面试最核心的还是考察「技术储备」,包括了语言基本功,操作系统、网络、体系结构、系统设计。 语言组织和表达能力,这点很重要,很多同学懂得某个知识点,却很难用简洁准确的语言表述出来。 想必有很多同学在刷题.

m0_56169789的博客 90

Android大牛近期大厂面试详解(附解答),华为移动应用开发平台

我最近从朋友那里收集到了2020-2021BAT 面试真题解析Android 基础、Java 基础、Android 源码相关分析、常见的一些原理性问题等等,可以很好地帮助大家深刻理解Android相关知识点的原理以及面试相关知识。这份资料把大厂面试中常被问到的技术点整理成了PDF,包知识脉络 + 诸多细节;还有 高级架构技术进阶脑图 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。这里也分享给广大面试同胞们,希望每位程序猿们都能面试成功~

m0_60707538的博客 543

太牛了!Android面试---弄懂这二十个问题,带你拿20K+的工作!

Android工程师必问面试题 1.APK安装过程 应用安装涉及到如下几个目录: system/app:系统自带的应用程序,无法删除 data/app:用户程序安装的目录,有删除权限。安装时把apk文件复制到此目录 data/data:存放应用程序的数据 data/dalvik-cache:将apk中的dex文件安装到dalvik-cache目录下 复制APK安装包到data/app目录下,解压并扫描安装包,把dex文件(Dalvik字节码)保存到dalvik-cache目录,并在data/data目录

wuyanghcoa的博客 452

2021年教你增加拿到BAT等大厂offer几率,我先收藏为敬

前言 早在2017年我们就建了第一个进击BAT的Android开发进阶交流群,两年期间很多群友都分享了自己的Android面试经历。其中就有很多群友已经斩获蚂蚁金服,天猫,高德,盒马等阿里系offer 收集反馈的面经资料比较乱,最近疫情期间终于空出大量时间,我们进行了分类,循序渐进,由基础到深入,由易到简。 将内容整理成了五个章节、计算机基础面试题、数据结构和算法面试题、Java面试题、Android面试题、其他扩展面试题、非技术面试题总共五个章节354页。 1、作用 Serializable的作用是为了

m0_53537576的博客 114
上一篇: 性能优化之 线程优化
下一篇: android 面试题 谈谈主线程一直循环 为什么不会出现阻塞或者ANR异常
zhoushenxian
博客等级 码龄12年 453粉丝 549原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值