Android编程知识
Android序列化完全指南:Parcelable vs Serializable
2025-02-11 26 0
简介 Android序列化Parcelable和Serializable的区别
Android序列化完全指南:Parcelable vs Serializable
一、什么是对象序列化?
对象序列化是将对象转换为可存储或传输的字节流的过程,反序列化则是将字节流还原为对象的过程。在Android开发中,序列化主要用于:
Activity/Fragment间传递对象
保存和恢复复杂数据结构
IPC(进程间通信)
二、Serializable实现方式
2.1 基本使用
import java.io.Serializable;public class User implements Serializable { private String name; private int age; // 建议显式声明(非必需) private static final long serialVersionUID = 1L; // 构造方法、getter/setter...}
2.2 使用示例
// 序列化
User user = new User("Alice", 25);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(user);
byte[] bytes = bos.toByteArray();
// 反序列化
ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
ObjectInputStream ois = new ObjectInputStream(bis);
User restoredUser = (User) ois.readObject();
2.3 特点
简单易用,只需实现接口
自动序列化所有非transient字段
性能较低(反射机制)
适合简单对象和持久化存储
三、Parcelable实现方式
3.1 基本实现
public class Book implements Parcelable { private String title; private String author; // 构造方法 public Book(String title, String author) { this.title = title; this.author = author; } // 反序列化构造器 protected Book(Parcel in) { title = in.readString(); author = in.readString(); } 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; // 普通对象返回0,有文件描述符返回1 } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(title); dest.writeString(author); } // getter/setter...}
3.2 使用示例
// Activity间传递
Intent intent = new Intent(this, DetailActivity.class);
intent.putExtra("book", book);
startActivity(intent);
// 接收方获取
Book receivedBook = getIntent().getParcelableExtra("book");
3.3 高级技巧
处理复杂对象:使用
readParcelable()
和writeParcelable()
处理集合:使用
readList()
/writeList()
或readTypedList()
自定义类型:实现Parcelable嵌套对象
四、核心差异对比
特性 | Parcelable | Serializable |
---|---|---|
性能 | 快(手动编码) | 慢(反射机制) |
实现复杂度 | 较高 | 简单 |
存储方式 | 内存 | 存储设备/网络 |
适用场景 | Android组件间通信 | 持久化/网络传输 |
维护成本 | 字段修改需同步更新 | 自动处理(需注意UID) |
五、选择建议
✅ 优先使用Parcelable:
Activity/Fragment间传递数据
高频调用的场景
包含大量数据的对象
✅ 使用Serializable:
需要持久化到文件
需要网络传输
简单数据结构的序列化
六、常见问题解答
Q1: 为什么要手动实现Parcelable?
A: 避免反射开销,提高性能,Android系统级优化
Q2: serialVersionUID有什么作用?
A: 用于版本控制,当类结构改变时保持兼容性
Q3: 如何处理继承关系?
A: 父类也需要实现Parcelable,并在子类中处理父类字段
Q4: 两种方式可以互相转换吗?
A: 不能直接转换,需要手动实现转换逻辑
七、最佳实践
对集合类型使用
ArrayList<Parcelable>
避免在Parcelable中处理大文件(使用Uri代替)
使用@Parcelize注解(Kotlin + Android Extensions)
定期检查serialVersionUID
对敏感数据使用transient关键字
八、性能测试数据
(基于1000次序列化/反序列化操作)
数据类型 | Parcelable耗时 | Serializable耗时 |
---|---|---|
简单对象 | 5ms | 120ms |
包含集合对象 | 15ms | 350ms |
嵌套复杂对象 | 25ms | 650ms |
通过这篇教程,你可以掌握Android序列化的核心知识。建议在实际开发中根据具体需求选择合适的序列化方式,对于性能要求高的场景优先使用Parcelable。随着项目复杂度提升,可以考虑更高级的序列化方案如Protocol Buffers或FlatBuffers。