笔友城堡 - 可定义的个人主页

前言

面试中也经常问到对象序列化,也就Android、Java黄总常见的SerializableParcelable,下面简单记录一下,方便自己查和学习。

正文

Serializable

Java的标准接口,也比较简单。

public class User implements Serializable {
    private static final long serialVersionUID = 1L;
    String name;
    int age;
}
  • 反射自动处理字段

  • 可指定serialVersionUID

性能

性能一般,因为使用了反射和IO流操作,会产生较多的临时对象,会引起频繁GC

使用场景
  • 持久化到文件

  • 网络传输

Parcelable

Android的专属接口。

比较复杂,需要自己实现序列化和反序列化方法

public class User implements Parcelable {
    String name;
    int age;

    protected User(Parcel in) {
        name = in.readString();
        age = in.readInt();
    }

    public static final Creator<User> CREATOR = new Creator<User>() {
        @Override
        public User createFromParcel(Parcel in) {
            return new User(in);
        }
        @Override
        public User[] newArray(int size) {
            return new User[size];
        }
    };

    @Override
    public int describeContents() { return 0; }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(name);
        dest.writeInt(age);
    }
}
  • 显式定义如何写 / 读字段

  • 必须提供 CREATOR

性能
  • Android专门为内存传输设计

  • 不依赖反射,直接操作 Parcel

  • 速度快(通常几倍到十倍以上)

Android官方推荐:组件间传递对象优先用Parcelable

使用场景
  • IntentBundle传对象

  • startActivity()、Broadcast、Fragment等args传输

  • 同设备、进程 / Binder 通信

Parcelable不是为长期存储或网络传输设计,不同Android 版本 Parcel格式可能变

总结

  • Serializable:Java 通用、简单、慢,适合存储/网络

  • Parcelable:Android 专用、手写(或注解)、快,组件间传值首选

维度SerializableParcelable
所属Java 标准Android
实现成本较高(可借助插件)
性能较低
反射
跨平台
长期存储

现在可用 Android Studio 插件 / Kotlin @Parcelize大幅简化 Parcelable

参考文章

AI

相关网址

笔友城堡 - 可定义的个人主页

暂无评论

评论审核已启用。您的评论可能需要一段时间后才能被显示。

none
暂无评论...