架构师基础技能:序列化与反序列化,Android的Parcelable与Serializable区别是什么

public class Test {
public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {
//实例化User类
User user =new User(1,“TestName”,“example@126.com”);
//序列化过程
ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(“test.txt”));
objectOutputStream.writeObject(user);
objectOutputStream.close();
System.out.println(“序列化成功!”);
//反序列化过程
ObjectInputStream objectInputStream =new ObjectInputStream(new FileInputStream(“test.txt”));
User newUser = (User) objectInputStream.readObject();
objectInputStream.close();
System.out.println(“反序列化成功!”);
System.out.println(“ID:”+newUser.id+" username:“+newUser.username+” Email:"+newUser.email);
}
}

运行Test.java,得到如下结果:

注意:

静态成员变量属于类,而不是对象,所以不会参与序列化;使用transient关键字标记的成员变量不参与序列化过程。

三、Parcelable接口

接下来我们要说的是Parcelable接口,该接口是Android提供的新的序列化方式。首先,先看官方文档对该接口的描述:

Interface for classes whose instances can be written to and restored from a Parcel. Classes implementing the Parcelable interface must also have a static field called CREATOR, which is an object implementing the Parcelable.Creator interface.

除了实现该接口的方法外,还需创建一个名叫CREATOR的静态对象,该对象实现了一个Parcelable.Creator的匿名内部类。以下是官方文档的一个类实现Parcelable接口的典型例子:

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 CREATOR
= new Parcelable.Creator() {
public MyParcelable createFromParcel(Parcel in) {
return new MyParcelable(in);
}

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

private MyParcelable(Parcel in) {
mData = in.readInt();
}
}

下面介绍一下以上各个方法的作用:

  • ①writeToParcel(Parcel out,int flags):将当前对象写入序列化结构之中。
  • ②createFromParcel(Parcel in):从序列化后的对象中创建原始对象
  • ③newArray(int size):创建指定长度的原始对象数组
  • ④MyParcelable(Parcel in):从序列化后的对象中创建原始对象

由以上各个方法可知,writeToParcel方法负责将对象序列化,而CREATOR负责数据的反序列化,只要你的类实现了Parcelable接口,并实现以上方法,那么就能自动地对对象进行序列化和反序列化了。

**注意:**在writeToParcel方法中,调用了out.writeInt(data)方法,如果当前类有多个属性,比如:int id,String name,String email,那么方法体可以写为:

out.writeInt(id);
out.writeString(name);
out.writeString(email);

这样写后,在相应的MyParcelable(Parcel in)反序列化方法也必须如下写:

in.readInt();
in.readString();
in.readString();

即顺序应该一一对应,否则,取出来的数据将会出错。   到目前为止,介绍了Serialable接口和Parcelable接口,这是IPC机制中比较基础的概念,应熟练掌握。希望我的文章能对你们的学习起到帮助作用。

四 Parcelable和Serializable的区别:

android自定义对象可序列化有两个选择一个是Serializable和Parcelable

1.对象为什么需要序列化
  • 永久性保存对象,保存对象的字节序列到本地文件。
  • 通过序列化对象在网络中传递对象。
  • 通过序列化对象在进程间传递对象。
2.当对象需要被序列化时如何选择所使用的接口
  • 在使用内存的时候ParcelableSerializable的性能高。
  • Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC(内存回收)。

3.Parcelable不能使用在将对象存储在磁盘上这种情况,因为在外界的变化下Parcelable不能很好的保证数据的持续性。
一个智能,新颖且易于使用的Android进程间通信(IPC)框架。(简单易用的安卓进展间通信IPC框架)

hermes架构的Github地址
可跨进程的EventBus 的Github地址
更多完整项目下载。未完待续。源码。图文知识后续上传github。
可以点击关于我 联系我获取

结语

由于篇幅限制,文档的详解资料太全面,细节内容太多,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!以下是目录截图:

由于整个文档比较全面,内容比较多,篇幅不允许,下面以截图方式展示 。

再附一部分Android架构面试视频讲解:

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

t/topics/618156601)**

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 23
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值