博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Serializable和Parcelable的简单介绍
阅读量:5948 次
发布时间:2019-06-19

本文共 4615 字,大约阅读时间需要 15 分钟。

  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     @Override33     public void writeToParcel(Parcel dest, int flags) {34         dest.writeString(color);35         dest.writeString(name);36     }37 38     public static final Creator
CREATOR = new Creator
() {39 @Override40 public Book createFromParcel(Parcel in) {41 return new Book(in);42 }43 44 @Override45 public Book[] newArray(int size) {46 return new Book[size];47 }48 };49 50 @Override51 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

你可能感兴趣的文章
SSL 设置域名访问
查看>>
P2P网络借贷系统简要解读
查看>>
Iframe网页内部的导航窗口
查看>>
67.sed工具
查看>>
LAMP+Zend平台搭建
查看>>
phpmyadmin不能登陆的几个常见解决方法
查看>>
PLSQL显示number数据类型时的设置
查看>>
Citrix 每周技术动态-20160814
查看>>
我的友情链接
查看>>
matlab-线性代数 判断 正交矩阵
查看>>
convert(一)—— 部署managed
查看>>
maven技术(一)软件安装与配置
查看>>
[转载] 古墓丽影2
查看>>
JPA(三) JPA API初探
查看>>
华为S5700系列交换机配置链路聚合LACP报错。
查看>>
linux的日志服务器关于屏蔽一些关键字的方法
查看>>
二进制安装kubernetes1.14.1初次尝试-02
查看>>
Java基础学习总结(14)——Java对象的序列化和反序列化
查看>>
linux系统管理---账号与权限管理
查看>>
我的友情链接
查看>>