Android(安卓)序列化
16lz
2021-01-25
序列化的目的:
1、永久性保存对象,保存对象的字节序列到本地文件中
2、让对象在网络中传递
3、让对象在IPC间传递
序列化的方法:
有两种实现序列化的方法,分别实现Serializable接口和Parcelable接口。前者是Java中的序列化接口,后者是Android自带的序列化接口。Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC,所以在使用内存时更推荐使用Parcelable。但Parcelable有一个明显的缺点是不能使用在将数据存储在磁盘上的情况。因为Parcelable本质上是为了更好的实现对象在IPC间传递,并不是一个通用的序列化机制。
代码实现:
Serializable接口的实现及运用:
Serializable的接口实现较简单,让类继承该接口即可,系统会自动将其序列化,具体代码如下
public class Book implements Serializable { private static final long serialVersionUID = 21455356667888L; private String mName; private String mPrice; public String getmName() { return mName; } public void setmName(String mName) { this.mName = mName; } public String getmPrice() { return mPrice; } public void setmPrice(String mPrice) { this.mPrice = mPrice; }}
在Activity中的使用
// serializable对象传递方法public void setSerializableMethod() { Book book = new Book(); book.setmName("王海康"); book.setmPrice("20$"); Intent intent = new Intent(this, BookTest.class); Bundle bundle = new Bundle(); bundle.putSerializable(SER_KEY, book); intent.putExtras(bundle); startActivity(intent);}// serializable对象获取方法public Book getSerializableMethod(){ Book mBook = (Book )getIntent().getSerializableExtra(SER_KEY); return mBook;}
Parcelable接口的实现和使用
1)implements Parcelable。
2)重写writeToParcel方法,将你的对象序列化为一个Parcel对象,即:将类的数据写入外部提供的Parcel中,打包需要传递的数据到Parcel容器保存,以便从Parcel容器获取数据。
3)重写describeContents方法,内容接口描述,默认返回0即可。
4)实例化静态内部对象CREATOR实现接口Parcelable.Creator 。
public class Person implements Parcelable { private String mName; private String mSex; private int mAge; public String getmName() { return mName; } public void setmName(String mName) { this.mName = mName; } public String getmSex() { return mSex; } public void setmSex(String mSex) { this.mSex = mSex; } public int getmAge() { return mAge; } public void setmAge(int mAge) { this.mAge = mAge; } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(mName); dest.writeString(mSex); dest.writeInt(mAge); } public static final Parcelable.Creator<Person> CREATOR = new Creator<Person>() { @Override public Person createFromParcel(Parcel source) { Person person = new Person(); person.mName = source.readString(); person.mSex = source.readString(); person.mAge = source.readInt(); return person; } //供反序列化本类数组时调用的 @Override public Person[] newArray(int size) { return new Person[size]; } };
在Activity中的使用
1、传递单一对象的具体代码
// parcelable对象传递方法public void setParcelableMethod() { Person person = new Person(); person.setmName("王海康"); person.setmSex("男"); person.setmAge(45); Intent intent = new Intent(this, PersonTest.class); Bundle bundle = new Bundle(); bundle.putParcelable(PAR_KEY, person); intent.putExtras(bundle); startActivity(intent);}// parcelable对象获取方法public Person getParcelableMethod(){ Person mPerson = (Person)getIntent().getParcelableExtra(PAR_KEY); return mPerson;}
2、传递对象列表具体代码
// parcelable对象List传递方法public void setParcelableListMethod() { ArrayList<Person> personList = new ArrayList<Person>(); Person person1 = new Person(); person1.setmName("王海康"); person1.setmSex("男"); person1.setmAge(45); personList.add(person1); Person person2 = new Person(); person2.setmName("薛岳"); person2.setmSex("男"); person2.setmAge(15); personList.add(person2); Intent intent = new Intent(this, PersonTest.class); Bundle bundle = new Bundle(); bundle.putParcelableArrayList(PAR_LIST_KEY, personList); intent.putExtras(bundle); startActivity(intent);}// parcelable对象获取方法public ArrayList<Person> getParcelableMethod(){ ArrayList<Person> mPersonList = getIntent().getParcelableExtra(PAR_LIST_KEY);return mPersonList;}
注意事项:
1、对象序列化不会关注类中的静态变量
2、当某个字段被声明为transient后,默认序列化机制就会忽略改字段
参考文档:
浅谈Android序列化
这里写链接内容
这里写链接内容
更多相关文章
- Android(安卓)的属性动画的实现和使用详解
- Android的四个基本概念(线程通信和GLSurfaceView)
- 第四章-View的工作原理(MeasureSpec、LayoutParams)
- Android(安卓)特色开发,基于位置的服务
- 你不得不了解的JVM(一)
- Android实现语音数据实时采集、播放
- 【安卓开发】Android为什么选择binder
- Handler、Message、MessageQueue、Looper协作简析
- 第五章(2)Libgdx应用框架之启动类和配置