目录
前言
Android开发中对应对象的序列化是比较常用的,序列化允许你将对象的状态保存到一个字节流中,以便可以在不同的组件或进程之间传递这些对象。
序列化常用的类有Parcelable 和Serializable相关知识,以及对比一下。记录一下,方便自己后续查阅或回顾。
正文
Parcelable
public class Book implements Parcelable { private String name; private int page; private long value; protected Book(Parcel in) { name = in.readString(); page = in.readInt(); value = in.readLong(); } public static final Creator<Book> CREATOR = new Creator<Book>() { @Override public Book createFromParcel(Parcel in) { return new Book(in); } @Override public Book[] newArray(int size) { return new Book[size]; } }; @Override public int describeContents() { return 0; } @Override public void writeToParcel(@NonNull Parcel dest, int flags) { dest.writeString(name); dest.writeInt(page); dest.writeLong(value); } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getPage() { return page; } public void setPage(int page) { this.page = page; } public long getValue() { return value; } public void setValue(long value) { this.value = value; } }
Serializable
public class Book implements Serializable { private String name; private int page; private long value; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getPage() { return page; } public void setPage(int page) { this.page = page; } public long getValue() { return value; } public void setValue(long value) { this.value = value; } }
区别
性能
Parcelable
性能高效。
Parcelable是专门为Android设计的序列化机制,它使用基于描述符的方式,避免了Java反射的开销,因此序列化和反序列化速度更快。
Android特有的接口。
Serializable
性能相对低些。
使用反射机制进行序列化和反序列化对象。
使用Java标准库的一部分,可夸平台。
安全性
Parcelable
由于Parcelable需要显式地为每个字段编写序列化和反序列化的逻辑,这有助于确保数据在传输过程中不会被篡改,因此更安全。
Serializable
基于Java反射机制,可能会受到恶意攻击,如反序列化漏洞等,安全性较低。
使用复杂度
Parcelable
复杂。
实现相对简单,只需要实现两个方法:writeToParcel和describeContents
Android Studio开发工具部分代码可以自动生成。
Serializable
简单。
只需让类实现 Serializable 接口,无需额外的方法实现。
用途
Parcelable
Android 特有: 主要用于 Android 应用内的数据传输,特别是在 Activity 之间通过 Intent 传递数据时。
IPC 优化: 在涉及进程间通信时,
Parcelable
通常比Serializable
更高效。
适用于需要在应用内部或不同组件间高效传输数据的情况,如Intent、Bundle等。
Serializable
跨平台兼容: 适用于任何 Java 环境,不仅限于 Android。
远程调用: 常用于 Java RMI(远程方法调用)和其他需要跨网络传输对象的场景。
适用于需要将对象持久化存储或通过网络传输到其他应用的情况。
参考文章
《
历史上的今天
© 版权声明