Android开发必备技能:数据序列化全解析(含代码示例)

在Android开发中,数据序列化是绕不开的"关卡"。它就像数据的"变形记",能让对象在内存、磁盘和网络间自由穿梭。但面对琳琅满目的序列化方案,开发者常常陷入选择困难。今天,我们就来一场"序列化大揭秘",帮你找到最适合的方案!

一、什么是数据序列化?

简单来说,序列化就是把对象"打包"成字节流,方便存储或传输;反序列化则是把字节流"拆包"还原成对象。比如:

  • 持久化存储:保存用户设置到本地文件。
  • 网络传输:把用户数据发送给服务器。
  • 进程间通信:在Activity间传递复杂对象。

二、Android序列化"六大法宝" + 代码示例

1. Serializable(Java原生方案)

  • 优点:实现超简单,只需声明接口,适合新手。
  • 缺点:性能差、易触发GC,就像"龟速快递"。
  • 适用场景:简单对象持久化,如缓存小文件。
java 复制代码
// 实现Serializable接口
public class User implements Serializable {
    private String name;
    private int age;
    // 构造方法、getter/setter省略
}

// 序列化:保存到文件
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("user.dat"));
oos.writeObject(user);
oos.close();

// 反序列化:从文件读取
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("user.dat"));
User user = (User) ois.readObject();
ois.close();

2. Parcelable(Android专属利器)

  • 优点:性能王者!内存操作无反射,适合高频传输。
  • 缺点:代码模板多,像"拼图游戏"有点麻烦。
  • 适用场景:Activity/Fragment传参,列表数据滑动。
java 复制代码
public class User implements Parcelable {
    private String name;
    private int age;

    // 必须实现的CREATOR
    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];
        }
    };

    // 从Parcel读取数据
    private User(Parcel in) {
        name = in.readString();
        age = in.readInt();
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(name);
        dest.writeInt(age);
    }

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

// 使用Intent传递Parcelable对象
Intent intent = new Intent(this, TargetActivity.class);
intent.putExtra("user", user);
startActivity(intent);

3. JSON序列化(Gson库示例)

  • 优点:可读性强,像"国际通用语言"一样方便。
  • 缺点:解析慢、占内存,大对象处理需谨慎。
  • 适用场景:网络API交互,跨平台数据交换。
java 复制代码
// 添加Gson依赖:implementation 'com.google.code.gson:gson:2.8.9'

public class User {
    private String name;
    private int age;
    // 构造方法、getter/setter省略
}

// 序列化:对象转JSON字符串
Gson gson = new Gson();
String json = gson.toJson(user);

// 反序列化:JSON字符串转对象
User user = gson.fromJson(json, User.class);

4. FlatBuffers(性能怪兽)

  • 优点:直接操作二进制,速度快到"飞起"!
  • 缺点:学习成本高,像"外星科技"需要适应。
  • 适用场景:游戏状态同步、高频数据交换。
java 复制代码
// 1. 定义schema(user.fbs)
// table User {
//   name:string;
//   age:int;
// }
// root_type User;

// 2. 生成Java类(使用flatc编译器)

// 3. 序列化/反序列化
FlatBufferBuilder builder = new FlatBufferBuilder(1024);
int nameOffset = builder.createString("Alice");
User.startUser(builder);
User.addName(builder, nameOffset);
User.addAge(builder, 30);
int userOffset = User.endUser(builder);
builder.finish(userOffset);

// 获取序列化后的字节数组
byte[] data = builder.sizedByteArray();

// 反序列化
ByteBuffer buffer = ByteBuffer.wrap(data);
User user = User.getRootAsUser(buffer);
String name = user.name();
int age = user.age();

三、如何选择?看场景!

  • 内存传输 (如Intent传参)→ Parcelable
  • 持久化存储 (如配置文件)→ SerializableJSON
  • 网络交互 (如API请求)→ JSON
  • 高性能场景 (如游戏)→ FlatBuffers
  • 结构化数据 (如用户表)→ SQLite/Room

四、实战案例:混合使用更灵活

比如,在电商APP中:

  1. 商品列表Parcelable 快速滑动加载。
  2. 用户订单 存到 SQLite 数据库。
  3. 支付信息JSON 加密传输到服务器。
  4. 游戏道具FlatBuffers 实现实时同步。

总结

没有"银弹",只有最合适的方案。理解每种序列化的优缺点,结合项目需求灵活选择,才能让数据"活"起来,让APP更高效!

相关推荐
还鮟4 小时前
CTF Web的数组巧用
android
小蜜蜂嗡嗡5 小时前
Android Studio flutter项目运行、打包时间太长
android·flutter·android studio
aqi005 小时前
FFmpeg开发笔记(七十一)使用国产的QPlayer2实现双播放器观看视频
android·ffmpeg·音视频·流媒体
zhangphil7 小时前
Android理解onTrimMemory中ComponentCallbacks2的内存警戒水位线值
android
你过来啊你7 小时前
Android View的绘制原理详解
android
移动开发者1号10 小时前
使用 Android App Bundle 极致压缩应用体积
android·kotlin
移动开发者1号10 小时前
构建高可用线上性能监控体系:从原理到实战
android·kotlin
ii_best15 小时前
按键精灵支持安卓14、15系统,兼容64位环境开发辅助工具
android
美狐美颜sdk15 小时前
跨平台直播美颜SDK集成实录:Android/iOS如何适配贴纸功能
android·人工智能·ios·架构·音视频·美颜sdk·第三方美颜sdk
恋猫de小郭20 小时前
Meta 宣布加入 Kotlin 基金会,将为 Kotlin 和 Android 生态提供全新支持
android·开发语言·ios·kotlin