在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。...远程处理使用序列化“通过值”在计算机或应用程序域之间传递对象。 简单地说,“序列化”就是将运行时的对象状态转换成二进制,然后保存到流、内存或者通过网络传输给其他端。...在安卓开发中,我们在组件中传递数据时常常使用 Intent 传输数据时需要传递 Serializable 或者 Parcelable 的数据,比如 Intent.putExtra 方法: public...接口 Parcelable 是 Android 特有的序列化接口: public interface Parcelable { //writeToParcel() 方法中的参数,用于标识当前对象作为返回值返回...Creator 属性,用于反序列化,将 Parcel 对象转换为 Parcelable public interface Creator { public T createFromParcel
在日常的应用开发中,我们可能需要让某些对象离开内存空间,存储到物理磁盘,以便长期保存,同时也能减少对内存的压力,而在需要时再将其从磁盘读取到内存,比如将某个特定的对象保存到文件中,隔一段时间后再把它读取到内存中使用...概括性来说序列化是指将对象实例的状态存储到存储媒体(磁盘或者其他介质)的过程。在此过程中,先将对象的公共字段和私有字段以及类的名称(包括类所在的程序集)转换为字节流,然后再把字节流写入数据流。...在随后对对象进行反序列化时,将创建出与原对象完全相同的副本。...newArray方法创建数组,最终利用Parcel的一系列read方法完成反序列化,最后由describeContents完成内容描述功能,该方法一般返回0,仅当对象中存在文件描述符时返回1。...同时由于User是另一个序列化对象,因此在反序列化方法中需要传递当前线程的上下文类加载器,否则会报无法找到类的错误。
可以以直接通过调用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.永久的保存对象数据(保存在文件当中,或者是磁盘中),需要时反序列化生成对象 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
如果你在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
01序列化对象Serializable Serializable接口是启用其序列化功能的接口,实现java.io.Serializable 接口的类是可序列化的,没有实现此接口的类将不能使它们的任一状态被序列化或逆序列化...02序列化对象Parcelable 由于Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC,会影响持续性能。...实现步骤如下: 将需要序列化的类实现Parcelable接口。 重写writeToParcel方法,将对象序列化为一个Parcel对象。...实例化静态内部对象CREATOR实现接口Parcelable.Creator。其中public static final一个都不能少,内部对象CREATOR的名称也不能改变,必须全部大写。...那么问题来了,系统强制停止了应用,进程死了,那么再次启动时Application自然新的,那里边的数据自然木有啦,如果直接使用很可能报空指针或者其他错误。
也可以传入Parcelable,Serializable对象或是对象数组。 传入Serializable对象 除了基本类型和String,可以传送对象吗? 答案是肯定的。...对象经历了序列化和反序列化的过程。 值得注意的是,Intent 能携带的对象大小并不是无限制的。实际开发中,需要开发者自己预估传输的数据大小。...onPause()方法:系统准备去启动或恢复另一个活动时调用。表示Activity正在停止,此时可做存储数据,停止动画等操作。 onStop()方法:在活动完全不可见的时候调用。...singletop模式(栈顶模式):当启动Activity时,会判断任务栈的栈顶是否为该Activity,如果是该Activity则不会创建实例,去回调onNewIntent(intent)方法,否则会创建实例...singletask模式(栈内模式):当启动Activity时,只要该Activity在指定的栈中,就不会创建实例,去回调onNewIntent(intent)**方法。
在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。 ...(obj) ; } }; 以上程序执行的时候出现了一个错误: 在使用Externalizable接口的时候需要在被序列化的类中定义一个无参构造,因为此接口在进行反序列化的时候...附录1: 在Windows下的路径分隔符和Linux下的路径分隔符是不一样的,当直接使用绝对路径时,跨平台会暴出“No such file or diretory”的异常。 ...1.什么是Parcelable接口: Parcelable接口定义了将数据写入Parcel和从Parcel读出的接口。...一个对象(实例),如果需要封装到消息中去,就必须实现这一接口,实现了这一接口,该实体就称为可打包的了。
putExtra(键,值)方法来添加要传递的数据,之后通过调用 getIntent().getStringExtra(键)来获取我们传递的值,通过这种方法我们能传递的对象类型是有限的,也就常见的类型,...下面我们就讨论一下这个问题: 1、Serializable方式 (序列化) Serializable是序列化的意思,表示将一个对象转换成可存储或者可传输的状态,序列化后的对象可以在网络上进行传输...,也可以存储在本地,至于序列化的方法也是很简单,只需要让一个类去实现Serializable接口就可以。 ...Parcelable ---- Parcelable方式的实现原理是将一个完整的对象进行分解,而分解后的每一部分都将是 Intent 所支持的数据类型,这样也就实现传递对象的功能。 ...,因此效率会比Parcelable低一些,所以在通常情况下我们还是建议使用Parcelable方式!
用于获取用户选择的文件(文档、图象、视频)的URI,并在应用中进行处理(例如,将文件发送到服务器中),大多Android/Java无法将Android ContentResolver返回的InputSteam...数据发送到服务器中。...这可能导致读取/写入任意文件。...ps:上面是我的理解,不知道对不对 访问任意组件 由于 Intent 是 Parcelable,因此属于此类的对象可以作为额外数据传递给另一个 Intent。...但是,开发人员可以将选择器显式设置为 null: intent.setComponent(null); intent.setSelector(null); 即便如此,您也可以创建一个隐式意图来匹配 某些未导出活动的
用于表示当前 Value 的数据类型,这在后续反序列化时要根据该数据类型进行创建实例。...Parcelable 只是一个序列化规则,它向开发人员暴露 Parcel 操作对象,自行写入要序列化的数据。...**序列化过程写入 value 数据时,先写入该 value 数据对应的 int 类型,该类型在反序列化时会用到,此时系统就是根据该 int 值对应的 value 类型反序列化对应数据。...//这样下次创建对应的Parcelable时,直接通过Creator实例createFromParcel创建, //避免了再次反射 map.put(name...CREATOR 实例,便于下次反序列化时直接通过 new 创建 该 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:需要创建的数组长度。
现在要把这个User对象保存下来,不然要是这个对象被别人改成了男可咋办。...当序列化的时候,系统会把当前类的serialVersionUID写入序列化的文件中,当反序列化的时候会去检测这个serialVersionUID,看他是否和当前类的serialVersionUID一致,...writeToParcel,代表将当前对象写入到序列化结构中。...正常情况下,对象在内存中进行传输确实是Parcelable比较快,但是Serializable是有缓存的概念的,有人做了一个比较有趣的实验: 当序列化一个超级大的对象图表(表示通过一个对象,拥有通过某路径能访问到其他很多的对象...),并且每个对象有10个以上属性时,并且Serializable实现了writeObject()以及readObject(),在平均每台安卓设备上,Serializable序列化速度大于Parcelable
(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,我们并不能直接实例化,但我们可以使用它的直接或间接实现类,比如
14、面试官:Serializable和Parcelable之间有什么区别? 15、面试官:什么是(ANR)错误,如何防止它在应用程序中发生?...当您需要一个生命周期与当前上下文分开的上下文时,或者在传递超出活动范围的上下文时,可以使用 Application Context 。 2、面试官:什么是 Armv7 ? 应聘者:我怎么知道?...应聘者:我没有太深入了解… 面试官:序列化是将对象转换为字节流以便将对象存储到内存中的过程,以便可以在以后的时间重新创建它,同时仍保留对象的原始状态和数据。...可以将变量声明为 transient 来禁止序列化。 可序列化是标准的 Java 接口。Parcelable 是 Android 专用的界面,可以在其中自行实现序列化。...应聘者:当 UI 停止响应超过5秒以上时,通常会因为已阻塞主线程而出现 ANR 对话框。为避免遇到ANR错误,应将尽可能多的任务移出主线程。
作用 指定当前组件要完成的动作 在 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
Serializable Serializable是序列化的意思,表示将一个对象转换成可存储或可传输的状态。...如果一个对象具有强引用,那垃圾回收器绝不会回收它。当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题。...ReferenceQueue类表示引用队列,它可以和这三种引用类联合使用,以便跟踪Java虚拟机回收所引用的对象的活动。...在任何时候,我们都可以调用ReferenceQueue的poll()方法来检查是否有它所关心的非强可及对象被回收。...如果这样做,当系统内存不足时,这些缓存数据会被回收,不会导致内存溢出。而当内存资源充足时,这些缓存数据又可以存在相当长的时间。 到底什么时候使用软引用,什么时候使用弱引用呢?
基于此隐患,攻击者可以创建一个实现类,如在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)方法。