美文网首页
序列化资料汇总

序列化资料汇总

作者: zhengzhoufeng | 来源:发表于2017-10-24 18:42 被阅读0次

【Android】Android中Serializable接口的定义和使用

1、序列化是干什么的?

简单说就是为了保存在内存中的各种对象的状态(也就是实例变量,不是方法),并且可以把保存的对象状态再读出来。虽然你可以用你自己的各种各样的方法来保存object states,但是Java给你提供一种应该比你自己好的保存对象状态的机制,那就是序列化。

2、什么情况下需要序列化

a)当你想把的内存中的对象状态保存到一个文件中或者数据库中时候;

b)当你想用套接字在网络上传送对象的时候;

c)当你想通过RMI传输对象的时候;

3、Parcelable和Serializable的区别:

内存间数据传输时推荐使用Parcelable,如activity间传输数据

保存到本地或者网络传输时推荐使用Serializable

serialVersionUID 用来表明类的不同版本间的兼容性。

有两种生成方式: 一个是默认的1L;另一种是根据类名、接口名、成员方法及属性等来生成一个64位的哈希字段 。

Android中传递对象的三种方法

Android中,Activity和Fragment之间传递对象,可以通过将对象序列化并存入Bundle或者Intent中进行传递,也可以将对象转化为JSON字符串,进行传递。

序列化对象可以使用Java的Serializable的接口、Parcelable接口。转化成JSON字符串,可以使用Gson等库。

1.Serializable

Model

publicclassAuthorimplementsSerializable{

privateintid;

privateStringname;

//...

}

publicclassBookimplementsSerializable{

privateStringtitle;

privateAuthorauthor;

//...

}

传递数据

Bookbook=newBook();

book.setTitle("Java编程思想");

Authorauthor=newAuthor();

author.setId(1);

author.setName("Bruce Eckel");

book.setAuthor(author);

Intentintent=newIntent(this,SecondActivity.class);

intent.putExtra("book",book);

startActivity(intent);

接收数据

Bookbook=(Book)getIntent().getSerializableExtra("book");

Log.d(TAG,"book title->"+book.getTitle());

Log.d(TAG,"book author name->"+book.getAuthor().getName());

2.转化为JSON字符串

Model

publicclassAuthor{

privateintid;

privateStringname;

//...

}

publicclassBook{

privateStringtitle;

privateAuthorauthor;

//...

}

传递数据

Bookbook=newBook();

book.setTitle("Java编程思想");

Authorauthor=newAuthor();

author.setId(1);

author.setName("Bruce Eckel");

book.setAuthor(author);

Intentintent=newIntent(this,SecondActivity.class);

intent.putExtra("book",newGson().toJson(book));

startActivity(intent);

接收数据

StringbookJson=getIntent().getStringExtra("book");

Bookbook=newGson().fromJson(bookJson,Book.class);

Log.d(TAG,"book title->"+book.getTitle());

Log.d(TAG,"book author name->"+book.getAuthor().getName());

3.使用Parcelable

实现Parcelable接口需要实现两个方法

describeContents方法。内容接口描述,默认返回0就可以;

writeToParcel方法。将传递的数据打包到Parcel容器中。

除了要实现这两个方法还必须创建一个Parcelable.Creator接口的实例,用于读取Parcel容器中的数据

Model

publicclassAuthorimplementsParcelable{

privateintid;

privateStringname;

//setter & getter...

@Override

publicintdescribeContents(){

return0;

}

@Override

publicvoidwriteToParcel(Parceldest,intflags){

//该方法将类的数据写入外部提供的Parcel中.即打包需要传递的数据到Parcel容器保存,

// 以便从parcel容器获取数据

dest.writeString(name);

dest.writeInt(id);

}

publicstaticfinalCreatorCREATOR=newCreator(){

@Override

publicAuthorcreateFromParcel(Parcelsource){

//从Parcel容器中读取传递数据值,封装成Parcelable对象返回逻辑层。

Authorauthor=newAuthor();

author.setName(source.readString());

author.setId(source.readInt());

returnauthor;

}

@Override

publicAuthor[]newArray(intsize){

//创建一个类型为T,长度为size的数组,仅一句话(return new T[size])即可。方法是供外部类反序列化本类数组使用。

returnnewAuthor[size];

}

};

}

publicclassBookimplementsParcelable{

privateStringtitle;

privateAuthorauthor;

//setter & getter...

@Override

publicintdescribeContents(){

return0;

}

@Override

publicvoidwriteToParcel(Parceldest,intflags){

dest.writeString(title);

dest.writeParcelable(author,flags);

}

publicstaticfinalCreatorCREATOR=newCreator(){

@Override

publicBookcreateFromParcel(Parcelsource){

Bookbook=newBook();

book.setTitle(source.readString());

book.setAuthor(source.readParcelable(Author.class.getClassLoader()));

returnbook;

}

@Override

publicBook[]newArray(intsize){

returnnewBook[0];

}

};

}

传递数据

Bookbook=newBook();

book.setTitle("Java编程思想");

Authorauthor=newAuthor();

author.setId(1);

author.setName("Bruce Eckel");

book.setAuthor(author);

Intentintent=newIntent(this,SecondActivity.class);

intent.putExtra("book",book);

startActivity(intent);

接收数据

Bookbook=getIntent().getParcelableExtra("book");

Log.d(TAG,"book title->"+book.getTitle());

Log.d(TAG,"book author name->"+book.getAuthor().getName());

4.性能分析

经过测试,可以看出,通过转换为字符串的速度是最慢的。Seralizable次之,Parcelable比Seralizable快10倍。所以从性能上考 虑,我们必定优先选择Parcelable。但是Parcelable有大量重复的模板代码,如何简化这些操作,将是下面主要讲解的内容。

5.简化Parcel操作

如果你使用android Studio 可以通过安装android-parcelable-intellij-plugin插件,或者自己配置模板进行操作。

5.1 parceler

除了上面的操作,还有大量的第三方库来简化Parcelable操作。当然使用这些库也许会降低Parcelable的性能。Parceler就是这样一个库。

Parceler使用非常简单,在定义Model时用@Parcel进行注解,在传递数据的时候使用Parcels的wrap方法来包装成一个Parcelable对象。获取数据时用Parcels的unwrap方法来获取对象。

Model

@Parcel

publicclassAuthor{

intid;

Stringname;

//setter & getter...

}

@Parcel

publicclassBook{

Stringtitle;

Authorauthor;

//setter & getter

}

传递对象

Bookbook=newBook();

book.setTitle("Java编程思想");

Authorauthor=newAuthor();

author.setId(1);

author.setName("Bruce Eckel");

book.setAuthor(author);

Intentintent=newIntent(this,SecondActivity.class);

intent.putExtra("book",Parcels.wrap(book));

startActivity(intent);

接收对象

Bookbook=Parcels.unwrap(getIntent().getParcelableExtra("book"));

Log.d(TAG,"book title->"+book.getTitle());

Log.d(TAG,"book author name->"+book.getAuthor().getName());

除了Parceler之外,还有如auto-parcel,ParcelableCodeGenerator,ParcelableGenerator等第三方库,这里我将不进行讲解,有兴趣的朋友,可以自行研究。

相关文章

  • 序列化资料汇总

    【Android】Android中Serializable接口的定义和使用 1、序列化是干什么的? 简单说就是为了...

  • PHP--序列化与反序列化详解

    PHP--序列化与反序列化详解 博客说明 文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有...

  • Java--序列化流详解

    Java--序列化流详解 博客说明 文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地...

  • 电子技术经典资料汇总:PCB设计篇

    电子技术经典资料汇总:PCB设计篇 分享《电子技术经典资料汇总:PCB设计篇》的资料,还有电子技术基础入门资料在闯...

  • 序列化

    序列化 学习资料 Java对象的序列化与反序列化-HollisChuang’s Blog 《成神之路-基础篇》Ja...

  • 资料汇总

    首先,我们应该承认近几年“互联网+”的概念异常火爆,一大批教育从业者涌入在线教育这个行业,其现状又是怎样呢? 我们...

  • 资料汇总

    综述 以下资料摘抄自计算广告资料汇总,后续会持续在此基础上进行补充。 papers 计算广告论文、学习资料、业界分...

  • 资料汇总

    https://www.educative.io/courses/grokking-the-system-desi...

  • 资料汇总

    Dubbo 1、Dubbo 简介(主要应用场景、核心功能和核心组件) Dubbo 是一款高性能、轻量级的开源 RP...

  • 资料汇总

    法语学习 幼儿: T'choupi et ses amis T'choupi 和他的 Pep...

网友评论

      本文标题:序列化资料汇总

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