美文网首页基础Android知识Android开发
Serializable 和 Parcelable 区别

Serializable 和 Parcelable 区别

作者: 唠嗑008 | 来源:发表于2017-03-24 11:19 被阅读92次
一、简介:

android 中自定义的对象序列化的问题有两个选择一个是Parcelable,另外一个是Serializable。

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

二、序列化、反序列化是什么?
(1) 名词解释
对象的序列化 : 把Java对象转换为字节序列并存储至一个储存媒介的过程。对象的反序列化:把字节序列恢复为Java对象的过程。

(2) 序列化详细解释
对象的序列化涉及三个点关键点:Java对象、字节序列、存储。

  1. Java对象的组成?Java对象包含变量与方法。但是序列与反序列化仅处理Java变量而不处理方法,序列与反序列化仅对数据进行处理。

  2. 什么是字符序列?字符序列是两个词,字符是在计算机和电信领域中,字符(Character)是一个信息单位。数学上,序列是被排成一列的对象(或事件)。《字符-维基百科》 , 《序列-维基百科》 说白了就是连续排列的多个字符的集合。类似于1A165613246546

  3. 存储字符序列需要保存到一个地方,可以是硬盘也可以是内存。简单说法是:序列化把当前对象信息保存下来。反序列化刚好相反的操作。

三、Java对象与Java对象序列化的区别?

Java对象存在的前提必须在JVM运行期间存在,如果想在JVM非运行的情况下或者在其他机器JVM上获取指定Java对象,在现有Java对象的机制下都不可能完成。

与Java对象不同的是,如果对Java对象执行序列化操作,因为原理是把Java对象信息保存到存储媒介,所以可以在以上Java对象不可能存在的两种情况下依然可以使用Java对象。

四、为什么要使用序列化、反序列化?
根据以上对序列化、反序列化的理解,这个疑问可以翻译成,为什么需要把对象信息保存到存储媒介中并之后读取出来?

因为开发中有在JVM非运行的情况下或者在其他机器JVM上获取指定Java对象的需求。

五、Android中Serializable与Parcelable区别?

1、两种都是用于支持序列化、反序列化话操作,两者最大的区别在于存储媒介的不同,Serializable使用IO读写存储在硬盘上,而Parcelable是直接在内存中读写,很明显内存的读写速度通常大于IO读写,所以在Android中通常优先选择Parcelable。

2、至于选取哪种可参考下面的原则:
1.)在使用内存的时候,Parcelable 类比Serializable性能高,所以推荐使用Parcelable类。

2.)Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC。

3.)Parcelable不能使用在要将数据存储在磁盘上的情况,因为Parcelable不能很好的保证数据的持续性在外界有变化的情况下。尽管Serializable效率低点, 也不提倡用,但在这种情况下,还是建议你用Serializable 。

六、实现:
1、 Serializable 的实现,只需要继承 implements Serializable 即可。这只是给对象打了一个标记,系统会自动将其序列化。

2、 Parcelabel 的实现,需要在类中添加一个静态成员变量 CREATOR,这个变量需要继承 Parcelable.Creator 接口。

public class MyParcelable implements Parcelable {
     private int mData;

     public int describeContents() {
         return 0;
     }

     public void writeToParcel(Parcel out, int flags) {
         out.writeInt(mData);
     }

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

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

相关文章

网友评论

    本文标题:Serializable 和 Parcelable 区别

    本文链接:https://www.haomeiwen.com/subject/hpnxottx.html