首页
学习
活动
专区
圈层
工具
发布

Android 进阶6:两种序列化方式 Serializable 和 Parcelable

在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。...远程处理使用序列化“通过值”在计算机或应用程序域之间传递对象。 简单地说,“序列化”就是将运行时的对象状态转换成二进制,然后保存到流、内存或者通过网络传输给其他端。...在安卓开发中,我们在组件中传递数据时常常使用 Intent 传输数据时需要传递 Serializable 或者 Parcelable 的数据,比如 Intent.putExtra 方法: public...接口 Parcelable 是 Android 特有的序列化接口: public interface Parcelable { //writeToParcel() 方法中的参数,用于标识当前对象作为返回值返回...Creator 属性,用于反序列化,将 Parcel 对象转换为 Parcelable public interface Creator { public T createFromParcel

1.8K50

Android序列化总结

在日常的应用开发中,我们可能需要让某些对象离开内存空间,存储到物理磁盘,以便长期保存,同时也能减少对内存的压力,而在需要时再将其从磁盘读取到内存,比如将某个特定的对象保存到文件中,隔一段时间后再把它读取到内存中使用...概括性来说序列化是指将对象实例的状态存储到存储媒体(磁盘或者其他介质)的过程。在此过程中,先将对象的公共字段和私有字段以及类的名称(包括类所在的程序集)转换为字节流,然后再把字节流写入数据流。...在随后对对象进行反序列化时,将创建出与原对象完全相同的副本。...newArray方法创建数组,最终利用Parcel的一系列read方法完成反序列化,最后由describeContents完成内容描述功能,该方法一般返回0,仅当对象中存在文件描述符时返回1。...同时由于User是另一个序列化对象,因此在反序列化方法中需要传递当前线程的上下文类加载器,否则会报无法找到类的错误。

97420
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Intent传递数据全解

    可以以直接通过调用Intent的putExtra()方法存入数据,然后在获得Intent后调用getXxxExtra获得 对应类型的数据;传递多个的话,可以使用Bundle对象作为容器,通过调用Bundle...序列化对象 Serializable实现: ①业务Bean实现:Serializable接口,写上getter和setter方法 ②Intent通过调用putExtra(String name,...Parcelable实现: 一般流程: ①业务Bean继承Parcelable接口,重写writeToParcel方法,将你的对象序列化为一个Parcel对象; ②重写describeContents...方法,内容接口描述,默认返回0就可以 ③实例化静态内部对象CREATOR实现接口Parcelable.Creator ④同样式通过Intent的putExtra()方法传入对象实例,当然多个对象的话...另外:Android中大量用到Parcelable对象,实现Parcable接口又是非常繁琐的,可以用到 第三方的开源框架:Parceler 可参考Android的Parcelable自动生成 两种序列化方式的比较

    1.2K40

    Android点将台:外交官

    1.永久的保存对象数据(保存在文件当中,或者是磁盘中),需要时反序列化生成对象 2.将对象数据转换成字节流进行网络传输 3.使用Intent时传递序列化对象 1.对象的序列化Serializable /...实现对象的序列化(Java版) 当一个实现Parcelable接口时必须实现describeContents和writeToParcel方法 感觉怪麻烦的,还好AndroidStudio有快捷生成方式...只能在Android中使用 P以Ibinder作为信息载体的,在内存上的开销比较小,P在性能方面要强于S S在序列化操作的时候会产生大量的临时变量,(反射机制)从而导致GC的频繁调用 |---Parcelable...的性能要强于Serializable 在读写数据的时候,Parcelable是在内存中直接进行读写 而Serializable是通过使用IO流的形式将数据读写入在硬盘上 Parcelable无法将数据进行持久化...("person", toly) //存放Parcelable序列化对象 val book = Book("《幻将录》", 10000) bundle.putParcelable("book", book

    32610

    深入了解Bundle和Map

    如果你在Intent对象中附加的是一个Map最常见的接口实现类HashMap,而不是包含附加信息的自定义类,你是幸运的,你可以用以下方法将map附加到Intent对象: intent.putExtra...在我们进行下一步之前,让我们去了解调用putExtra()/get*Extra()时涉及到的一些类或方法。 提示:文章很长,如果你只是想要一个解决方案的话,请跳到文章的最后面解决方案那里。...我们注意到mMap是一个ArrayMap 这里开始出现问题了 第二步:分析写入 map 有趣的是当把Bundle中的值写入到一个Parcel中时,如果此时我们去检查我们附加值的类型,我们发现仍然能得到正确的类型...但是,如果你在一个Bundle里对TreeMap 黑洞启示录: 在这里已经非常清楚了,当Map写入到一个Parcel时,Map丢失了它们的类型,所以当我们再次读时是没办法来复原原来的信息。...null : ((MapWrapper)s).getMap(); } } } 另一个可行的解决方案: 另一个解决方法是,在你将Map附加到Intent前,将Map转成byte array

    95361

    Activity间数据传递方法汇总

    01序列化对象Serializable Serializable接口是启用其序列化功能的接口,实现java.io.Serializable 接口的类是可序列化的,没有实现此接口的类将不能使它们的任一状态被序列化或逆序列化...02序列化对象Parcelable 由于Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC,会影响持续性能。...实现步骤如下: 将需要序列化的类实现Parcelable接口。 重写writeToParcel方法,将对象序列化为一个Parcel对象。...实例化静态内部对象CREATOR实现接口Parcelable.Creator。其中public static final一个都不能少,内部对象CREATOR的名称也不能改变,必须全部大写。...那么问题来了,系统强制停止了应用,进程死了,那么再次启动时Application自然新的,那里边的数据自然木有啦,如果直接使用很可能报空指针或者其他错误。

    1.2K60

    Android入门教程之Activity(生命周期,启动...)

    也可以传入Parcelable,Serializable对象或是对象数组。 传入Serializable对象 除了基本类型和String,可以传送对象吗? 答案是肯定的。...对象经历了序列化和反序列化的过程。 值得注意的是,Intent 能携带的对象大小并不是无限制的。实际开发中,需要开发者自己预估传输的数据大小。...onPause()方法:系统准备去启动或恢复另一个活动时调用。表示Activity正在停止,此时可做存储数据,停止动画等操作。 onStop()方法:在活动完全不可见的时候调用。...singletop模式(栈顶模式):当启动Activity时,会判断任务栈的栈顶是否为该Activity,如果是该Activity则不会创建实例,去回调onNewIntent(intent)方法,否则会创建实例...singletask模式(栈内模式):当启动Activity时,只要该Activity在指定的栈中,就不会创建实例,去回调onNewIntent(intent)**方法。

    1.8K00

    Java IO之对象的序列化、ObjectInputStream和ObjectOutputStream类

    在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。   ...(obj) ;       }   };     以上程序执行的时候出现了一个错误:    在使用Externalizable接口的时候需要在被序列化的类中定义一个无参构造,因为此接口在进行反序列化的时候...附录1:    在Windows下的路径分隔符和Linux下的路径分隔符是不一样的,当直接使用绝对路径时,跨平台会暴出“No such file or diretory”的异常。     ...1.什么是Parcelable接口:    Parcelable接口定义了将数据写入Parcel和从Parcel读出的接口。...一个对象(实例),如果需要封装到消息中去,就必须实现这一接口,实现了这一接口,该实体就称为可打包的了。

    1.3K30

    Android学习--还有一些小技巧

    putExtra(键,值)方法来添加要传递的数据,之后通过调用 getIntent().getStringExtra(键)来获取我们传递的值,通过这种方法我们能传递的对象类型是有限的,也就常见的类型,...下面我们就讨论一下这个问题:       1、Serializable方式 (序列化)       Serializable是序列化的意思,表示将一个对象转换成可存储或者可传输的状态,序列化后的对象可以在网络上进行传输...,也可以存储在本地,至于序列化的方法也是很简单,只需要让一个类去实现Serializable接口就可以。      ...Parcelable ----       Parcelable方式的实现原理是将一个完整的对象进行分解,而分解后的每一部分都将是 Intent 所支持的数据类型,这样也就实现传递对象的功能。      ...,因此效率会比Parcelable低一些,所以在通常情况下我们还是建议使用Parcelable方式!

    75230

    【Android】Serializable和Parcelable序列化对象:传递自定义类数据

    二:Parcelable打包数据 想要让数据传输中性能更好,Android中专门诞生了一个接口Parcelable(包是安卓下的) 顾名思义parcelable 翻译为 “可打包的” (用于跨进程传输...(如文件描述符等)——这里了解即可,用的不多 通常情况下返回 0 即可,只有当对象中包含需要特殊处理的数据时才返回非 0 值 3:writeToParcel-打包 对象序列化的核心方法,将当前对象的所有成员变量写入到...,那就先读取三个变量,在作为构造方法里的参数进行传参,但是不行因为这是静态方法 CREATOR 是 静态内部实现(public static final Creator CREATOR...Parcel 对象中读取数据 参数 source:是之前通过 writeToParcel() 写入数据的 Parcel 对象(可以理解为 “数据源”)。...6:newArray(int size) 方法 Student 数组,用于批量反序列化时使用(例如从 Parcel 中读取多个 Student 对象时)。 参数 size:需要创建的数组长度。

    19110

    漫谈序列化—使用、原理、问题

    现在要把这个User对象保存下来,不然要是这个对象被别人改成了男可咋办。...当序列化的时候,系统会把当前类的serialVersionUID写入序列化的文件中,当反序列化的时候会去检测这个serialVersionUID,看他是否和当前类的serialVersionUID一致,...writeToParcel,代表将当前对象写入到序列化结构中。...正常情况下,对象在内存中进行传输确实是Parcelable比较快,但是Serializable是有缓存的概念的,有人做了一个比较有趣的实验: 当序列化一个超级大的对象图表(表示通过一个对象,拥有通过某路径能访问到其他很多的对象...),并且每个对象有10个以上属性时,并且Serializable实现了writeObject()以及readObject(),在平均每台安卓设备上,Serializable序列化速度大于Parcelable

    1.1K20

    Activity之间的数据传递方法汇总

    (String name, Parcelable value); intent.getParcelableExtra(String name); 这两种实现序列化的方法的使用原则: 1)在使用内存的时候...3)Parcelable 不能使用在要将数据存储在磁盘上的情况,因为 Parcelable 不能很好的保证数据的持续性在外界有变化的情况下。...还是以前面的两个 Activity 为例,传递不支持序列化的 Student 对象。...当两个 apply 同时操作时,后调用 apply 的将会被保存到 Storage 中;当有 apply正在执行时,调用 commit,commit 将被阻塞,直到 apply 执行完。...3、SharedPreferences 支持的数据类型都必须是支持序列化操作的,上面提到的 Set是一个 interface,我们并不能直接实例化,但我们可以使用它的直接或间接实现类,比如

    3.6K40

    已中招!Android 基础面试常常吊死在这几个问题上……

    14、面试官:Serializable和Parcelable之间有什么区别? 15、面试官:什么是(ANR)错误,如何防止它在应用程序中发生?...当您需要一个生命周期与当前上下文分开的上下文时,或者在传递超出活动范围的上下文时,可以使用 Application Context 。 2、面试官:什么是 Armv7 ? 应聘者:我怎么知道?...应聘者:我没有太深入了解… 面试官:序列化是将对象转换为字节流以便将对象存储到内存中的过程,以便可以在以后的时间重新创建它,同时仍保留对象的原始状态和数据。...可以将变量声明为 transient 来禁止序列化。 可序列化是标准的 Java 接口。Parcelable 是 Android 专用的界面,可以在其中自行实现序列化。...应聘者:当 UI 停止响应超过5秒以上时,通常会因为已阻塞主线程而出现 ANR 对话框。为避免遇到ANR错误,应将尽可能多的任务移出主线程。

    2.9K20

    Carson带你学Android:这是一份全面&详细的Intent学习指南

    作用 指定当前组件要完成的动作 在 Android 不同组件间 传递数据 Activity、Service、BroadcastReceiver之间的通信载体 = Intent 下面,将根据Intent...实例化显式Intent & 通过构造函数接收2个参数 // 参数1 = Context:启动活动的上下文,一般为当前Activity // 参数2 = Class:是指定要启动的目标活动...Serializable对象、Parcelable及其对应数组、CharSequence 类型 d. ArrayList,泛型参数类型为:、Parcelable>、、 4.3 具体使用 在当前Activity把要传递的数据暂存在Intent中、在新启动的Activity中取出Intent...中的数据 方法1:putExtra() // 目的:将FristActivity中的一个字符串传递到SecondActivity中,并在SecondActivity中将Intent对象中的数据(FristActivity

    74830

    Carson带你学Android:这是一份全面 & 详细的Intent组件学习指南

    作用 指定当前组件要完成的动作 在 Android 不同组件间 传递数据 Activity、Service、BroadcastReceiver之间的通信载体 = Intent 下面,将根据Intent...实例化显式Intent & 通过构造函数接收2个参数 // 参数1 = Context:启动活动的上下文,一般为当前Activity // 参数2 = Class:是指定要启动的目标活动...Serializable对象、Parcelable及其对应数组、CharSequence 类型 d. ArrayList,泛型参数类型为:、Parcelable>、、 4.3 具体使用 在当前Activity把要传递的数据暂存在Intent中、在新启动的Activity中取出Intent...中的数据 方法1:putExtra() // 目的:将FristActivity中的一个字符串传递到SecondActivity中,并在SecondActivity中将Intent对象中的数据(FristActivity

    62020

    Android:关于 Intent组件的那些小事(介绍、使用方法等)

    作用 指定当前组件要完成的动作 在 Android 不同组件间 传递数据 Activity、Service、BroadcastReceiver之间的通信载体 = Intent 下面,将根据Intent...实例化显式Intent & 通过构造函数接收2个参数 // 参数1 = Context:启动活动的上下文,一般为当前Activity // 参数2 = Class:是指定要启动的目标活动...Serializable对象、Parcelable及其对应数组、CharSequence 类型 d. ArrayList,泛型参数类型为:、Parcelable>、、 4.3 具体使用 在当前Activity把要传递的数据暂存在Intent中、在新启动的Activity中取出Intent...中的数据 方法1:putExtra() // 目的:将FristActivity中的一个字符串传递到SecondActivity中,并在SecondActivity中将Intent对象中的数据(FristActivity

    1.2K50

    Intent传递对象,强引用、软引用、弱引用的使用

    Serializable Serializable是序列化的意思,表示将一个对象转换成可存储或可传输的状态。...如果一个对象具有强引用,那垃圾回收器绝不会回收它。当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题。...ReferenceQueue类表示引用队列,它可以和这三种引用类联合使用,以便跟踪Java虚拟机回收所引用的对象的活动。...在任何时候,我们都可以调用ReferenceQueue的poll()方法来检查是否有它所关心的非强可及对象被回收。...如果这样做,当系统内存不足时,这些缓存数据会被回收,不会导致内存溢出。而当内存资源充足时,这些缓存数据又可以存在相当长的时间。 到底什么时候使用软引用,什么时候使用弱引用呢?

    58100

    挖洞经验 | Google Play Core Library中的代码执行漏洞

    基于此隐患,攻击者可以创建一个实现类,如在Parcelable接口中包含进恶意代码,然后把其实例发送到存在漏洞的APP应用去,这样的话,利用createFromParcel方法的反序列化操作即可实现本地代码执行...POC验证 Oversecured公司选择Google Chrome APP作为测试目标,通过执行chmod -R 777 /data/user/0/com.android.chrome进行权限分配,启动...APP应用后,由于未受保护的消息接收器receiver在Google Play Core library中进行了注册,3秒后,消息接收器receiver便接收到了加载已序列化对象类ClassResolver...的测试指令,5秒后,攻击者通过发送对象EvilParcelable,实现了反序列化过程的代码执行。...在安卓应用中,当某个组件接收到一个意图指令状态后,其所有附加对象都会被执行反序列化,如Intent.hasExtra(name)方法。

    1.8K20
    领券