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嵌套对象

四、核心差异对比

特性ParcelableSerializable
性能快(手动编码)慢(反射机制)
实现复杂度较高简单
存储方式内存存储设备/网络
适用场景Android组件间通信持久化/网络传输
维护成本字段修改需同步更新自动处理(需注意UID)

五、选择建议

✅ 优先使用Parcelable:

  • Activity/Fragment间传递数据

  • 高频调用的场景

  • 包含大量数据的对象

✅ 使用Serializable:

  • 需要持久化到文件

  • 需要网络传输

  • 简单数据结构的序列化

六、常见问题解答

Q1: 为什么要手动实现Parcelable?
A: 避免反射开销,提高性能,Android系统级优化

Q2: serialVersionUID有什么作用?
A: 用于版本控制,当类结构改变时保持兼容性

Q3: 如何处理继承关系?
A: 父类也需要实现Parcelable,并在子类中处理父类字段

Q4: 两种方式可以互相转换吗?
A: 不能直接转换,需要手动实现转换逻辑

七、最佳实践

  1. 对集合类型使用ArrayList<Parcelable>

  2. 避免在Parcelable中处理大文件(使用Uri代替)

  3. 使用@Parcelize注解(Kotlin + Android Extensions)

  4. 定期检查serialVersionUID

  5. 对敏感数据使用transient关键字

八、性能测试数据

(基于1000次序列化/反序列化操作)

数据类型Parcelable耗时Serializable耗时
简单对象5ms120ms
包含集合对象15ms350ms
嵌套复杂对象25ms650ms

通过这篇教程,你可以掌握Android序列化的核心知识。建议在实际开发中根据具体需求选择合适的序列化方式,对于性能要求高的场景优先使用Parcelable。随着项目复杂度提升,可以考虑更高级的序列化方案如Protocol Buffers或FlatBuffers。


点赞 0

我的名片

网名:梦宇信息技术

职业:软件开发、Mes系统工程师

现居:福建省-福州市

QQ:703159

站点信息

  • 联系QQ:703159
  • 文章统计97篇文章
  • 标签总数6
  • 加我微信:扫码,加我微信