Serializable和Parcelable的简单介绍

  Serializable和Pacelable接口可以完成对象的序列化过程,当我们需要通过Intent和Binder传输数据时就需要使用Parcelable或者Serializable。

Serializable接口                                                                                                                               Serializable是Java所提供的一个序列化的接口,它是一个空接口,为对象提供标准的序列化和反序列化操作。

public class Person implements Serializable {
    private static final long serialVersionUID = 11347198374914134L;

    private String name;
    private int age;

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

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

想要让一个类实现序列化,只需要这个类实现Serializable接口并声明一个serialVersionUID即可。实际上,这个serialVersionUID也不是必须的,但是不声明会产生影响。serialVersionUID是用来辅助序列化的,原则上序列化后数据中的serialVersionUID只有和当前类的serialVersionUID相同才能够正常的被反序列化。serialVersionUID的详细工作机制是这样的:序列化的时候系统会把当前类的serialVersionUID写入序列化的文件中,当反序列化的时候系统会去检测文件中的serialVersionUID,看它是否和当前类的serialVersionUID一致,一致说明序列化的类和当前类的版本相同,可以成功反序列化,否则说明当前类发生了改变,这个时候就无法正常序列化。当我们没有手动指定serialVersionUID的值时系统会自动生成,当类结构发生改变,系统会重新计算当前类的serialVersionUID值。这时就可能出现反序列化失败的情况,所以我们应尽量手动指定serialVersionUID值。

 

Parcelable接口

Pracelable是android中的序列化方式,因此更适合用在android平台上。缺点是使用起来较为麻烦,不仅需要声明,还需要实现其内部方法。但是它的效率很高。

 1 public class Book implements Parcelable {
 2 
 3     private String name;
 4     private String color;
 5 
 6     public Book(String name, String color){
 7         this.name = name;
 8         this.color = color;
 9     }
10 
11     public String getColor() {
12         return color;
13     }
14 
15     public void setColor(String color) {
16         this.color = color;
17     }
18 
19     public String getName() {
20         return name;
21     }
22 
23     public void setName(String name) {
24         this.name = name;
25     }
26 
27     protected Book(Parcel in) {
28         color = in.readString();
29         name = in.readString();
30     }
31 
32     @Override
33     public void writeToParcel(Parcel dest, int flags) {
34         dest.writeString(color);
35         dest.writeString(name);
36     }
37 
38     public static final Creator<Book> CREATOR = new Creator<Book>() {
39         @Override
40         public Book createFromParcel(Parcel in) {
41             return new Book(in);
42         }
43 
44         @Override
45         public Book[] newArray(int size) {
46             return new Book[size];
47         }
48     };
49 
50     @Override
51     public int describeContents() {
52         return 0;
53     }
54 }

使用serializable和parcelable传递数据

//使用serializable传递数据
        findViewById(R.id.btn_serializable).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this, SecondActivity.class);
                //传递方式一
                intent.putExtra("put_person", person);
                //传递方式二
                Bundle bundle = new Bundle();
                bundle.putSerializable("bundle_person", person);
                intent.putExtras(bundle);
                startActivity(intent);
            }
        });

        //使用parcelable传递数据
        findViewById(R.id.btn_parcelable).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this, ThirdActivity.class);

                Book book = new Book("abc","yellow");

//                intent.putExtra("book", book);
                Bundle bundle = new Bundle();
                bundle.putParcelable("book",book);
                intent.putExtras(bundle);
                startActivity(intent);
            }
        });
public class SecondActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);

        TextView tv_content = (TextView) findViewById(R.id.tv_content);

        Intent intent = getIntent();
        //Person person = (Person) intent.getSerializableExtra("put_person");
        Person person = (Person) intent.getSerializableExtra("bundle_person");
        tv_content.setText("name:" + person.getName() + " age:" + person.getAge());
    }
}
public class ThirdActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_third);

        TextView tv_content = (TextView) findViewById(R.id.tv_content);

        Intent intent = getIntent();
        Book book = intent.getParcelableExtra("book");

        tv_content.setText("name:" + book.getName() + " coloe:" + book.getColor());
    }
}

 

转载于:https://www.cnblogs.com/knabe/p/7677735.html

Android面试八股文】Android两种序列化方式SerialzableParcelable有什么区别?为什么Intent传递对象需要序列化? 如果你想成为一个优秀的软件工程师,你需要多花点时间来实现Parcelable,因为这将会为你对象的序列化过程快10多倍,而且占用较少的资源。但是大多数情况下,的龟速不会太引人注目。你想偷点懒就用它吧,不过要记得serialization是一个比较耗资源的操作,尽量少使用。如果你想要传递一个包含许多对象的列表,那么整个序列化的过程的时间开销可能会超过一秒,这会让屏幕转向的时候变得很卡顿。 阅读详情

相关推荐

Android中的对象序列化反序列化:SerializableParcelable

要实现Parcelable接口,需要实现describeContents()方法writeToParcel()方法来将对象写入Parcel,以及Parcelable.Creator接口的createFromParcel()方法来从Parcel中读取并构造对象。要将Parcelable对象写入Parcel,可以使用writeToParcel()方法,从Parcel中读取并构造对象可以使用Parcelable.Creator接口的createFromParcel()方法。

code_welike的博客 146

序列化-SerializableParcelable简单介绍

文章目录序列化的本质Serializable序列化过程反序列化过程ExternalizableParcelable 序列化的本质 序列化是一种用来处理对象流的机制。序列化是为了解决在对对象流进行读写操作时所引发的问题。 序列化:将java对象转换成字节序列的过程,字节码可以保存到数据库、内存、文件等,也可用于网络传输 反序列化:将字节序列恢复为java对象的过程。 序列化实现的方式有很多方案,在java中是使用的JDK内置的Serializable接口来实现序列化,而Android SDK中增加Parcel

csdnxia的博客 657

计算机模拟爆破过程,基于LSDYNA岩石爆破模拟建模分析

原标题:基于LSDYNA岩石爆破模拟建模分析 Ls Dyna岩石爆破模拟仿真作者:dyna_focus擅长领域:dyna/abaqus/hypermesh一、 数值模型的建立1.1 单元及算法的选择岩石,炸药,空气都采用solid164实体单元。岩石采用常应力实体单元,该种单元属于纯粹的lagrange算法,该种算法单元网格附着在材料上,随着材料的流动而产生单元网格的变形,但是在结构变形巨大时,有...

weixin_29494379的博客 7266

Android 中Kotlin实现ParcelableSerializable

尽管Serializable简单,但是为了app性能,最好还是用Parcelable。return 0:"":0> {分析:发现什么问题了吗?没错,Percelable的实现方式更复杂,Serializable只需实现一个接口就完成了,管他那么多,Serializable就完事了(这也是我至今都喜欢Serializable的原因)后面在阅读官方文档的时候,发现Percelable也有了简单的方式,而且官方也是推荐使用 Percelable,所以还是更改了使用习惯。

Mark Wu 的博客 1746

Android 你不可不知的对象序列化 SerializableParcelable

Android 你不可不知的对象序列化 SerializableParcelable 目录结构 1. 序列化的目的 2. Android中序列化的两种方式ParcelableSerializable 3. ParcelableSerializable的性能比较 4. ParcelableSerializable使用场景 5. Serializable接口实现序列化 6. Parcelab...

bencheng06的博客 909

Android进阶 - 1 - ParcelableSerializable使用详解

如果我们需要通过IntentBinder传输数据时就需要使用Parcelable或者Serializable对对象序列化。甚至有时候在把持久化的对象保存在存储设备上或者通过网络传输给其他客户端的时候,需要使用Serializable来完成对象的持久化。在实际开发过程中,习惯了使用序列化传输数据,但是并没有深入了解。Andriod进阶从序列化开始。 Serializable     简介

行云间 4402

Android随笔-SerializableParcelable

序列化与反序列化是Android中进程间通信常用的手段之一,SerializableParcelable都可以实现对象的序列化反序列化,SerializableJava提供的,属于统一接口,而ParcelableAndroid提供的,属于Android特有的。

古典码 785

Android - SerializableParcelable

Serializable是序列化的意思,表示将一个对象转换成可存储或可传输的状态。序列化后的对象 可以在网络上进行传输,也可以存储到本地。至于序列化的方法非常简单,只需要让一个类去 实现Serializable这个接口就可以了。这里我们让Person类实现了Serializable接口,这样所有的Person对象都是可序列化的 了。可以看到,这里我们创建了一个Person的实例,并将它直接传入了Intent的putExtra()方法 中。

m0_59482482的博客 739

Serializable接口Parcelable接口

有关Serializable接口Parcelable接口的简单介绍

SakuraMG的博客 740

安卓——使用Intent传递对象,SerializableParcelable

基本操作就是实现SerializableParcelable接口,并将对象作为额外数据(extra)添加到Intent中。我们先讲述第一种方法:

weixin_73588491的博客 1313

AndroidSerializableParcelable接口的区别用法

文章目录前言一、为什么要序列化,以及两种序列化方式的区别?二、使用方法1.Serializable 接口使用方式2.Parcelable接口使用方式总结 前言 Android中Intent中传递对象有两种方法,一种是该对象实体实现Serializable接口,使用putSerializable(Key,Object);另一种是实现Parcelable接口,使用putParcelable(Key, Object)方法。 一、为什么要序列化,以及两种序列化方式的区别? Serializable接口Par

weixin_42703246的博客 1427

AndroidSerializableParcelable序列化对象:传递自定义类数据

SerializableJava标准接口,通过实现该接口即可实现对象序列化传输;ParcelableAndroid专用接口,需实现writeToParcel打包方法CREATOR拆包方法

阿华的博客 954

ParcelableSerializable

  ParcelableSerializable功能对比 1.ParcelableSerializable 都可以实现安卓数据的序列化 2.Parcelable 是安卓专用序列化方式,开销比较小,使用麻烦,效率高;Serializablejava序列化方式使用简单需要大量I/O操作,效率低 3.Serializable 序列化可以把数据存储在外存中,保存数据相对于Parcelab...

startCrazyActivity的博客 588

在Activity之间传递参数(三)——serializableparcelable的区别

传递值对象: 一、serializable实现:简单易用   serializable的迷人之处在于你只需要对某个类以及它的属性实现Serializable 接口即可。Serializable 接口是一种标识接口,这意味着无需实现方法,Java便会对这个对象进行高效的序列化操作。   这种方法的缺点是使用了反射,序列化的过程较慢。这种机制会在序列化的时候创建许多的临时对象,容易触发...

banba3095的博客 203

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

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

Misdirection_XG的博客 209

Android——SerializableParcelable

Android 开发中,Parcelable Serializable 是两种用于对象序列化的接口。

大风起兮云飞扬 573

android java 实体类 object变量 保存_Android中Intent传递对象的两种方法Serializable,Parcelable...

Android中的传递有两个方法,一个是Serializable,另一个是ParcelableSerializable是J2SE本身就支持的。而ParcelableAndroid所特有的。二者的使用场景区别:1)在使用内存的时候,ParcelableSerializable性能高,所以推荐使用Parcelable。2)Serializable在序列化的时候会产生大量的临时变量,从而引起频繁...

weixin_28807463的博客 205

Android - 序列化 SerializableParcelable

我们使用 Intent 传递数据的时候,putExtra() 所支持的数据类型事有限的,当需要传递自定义对象的时候就需要序列化。

HugMua的博客 1265

实体类的序列化-SerializableParcelable

数据的序列化是指,将我们程序开发的对象类,转化为计算机存储的最小单位,字节序列。数据的反序列化是指:将计算机中的字节序列转换为我们开发中的对象实体类。

1034

Android 序列化的那些事(Serializable & Parcelable

谨以文章记录学习历程,如有错误还请指明,转载或引用请注明出处。 什么是序列化?为什么?怎么做? 百科是这么定义序列化的: 序列化 (Serialization)将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。 另外,还提到了一个技术: 二进...

whdAlive 's blog 275
上一篇: PHP IPC on Linux
下一篇: SpringBoot使用Swagger搭建Rest服务
weixin_33958366
博客等级 码龄11年 6309粉丝 149原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值