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更高效!

相关推荐
千里马学框架2 天前
一起学 Android 14:ShellTransition 屏幕旋转过程深度剖析
android·智能手机·性能优化·framework·性能·屏幕旋转·rotation
美狐美颜SDK开放平台2 天前
开发直播APP时如何接入视频美颜SDK?开发流程与注意事项
android·人工智能·计算机视觉·音视频·直播美颜sdk
AFinalStone2 天前
Android7 SystemUI源码解析(七)Keyguard锁屏模块深度解析
android·systemui
致远ccc2 天前
Google Play 上架前如何测试 App?多国家 Android 环境测试
android·app测试·googleplay·多国家应用测试
ttyyttemo2 天前
Kotlin 协程中的 Job 结构化并发与取消
android
sun0077002 天前
tbox 4g/5g切换,导致wan ip 改变,导致车机旧网络不可用。需要重启车机才行
android
其实防守也摸鱼2 天前
内网穿透与反向代理:原理、工具与实战指南
android·大数据·运维·安全·网络安全·自动化·渗透
AFinalStone2 天前
Android7 SystemUI 源码解析(四)NavigationBar 导航栏与 SystemBars
android·systemui
JMchen2 天前
属性动画原理与高级动画实现
android·kotlin·canvas
AFinalStone2 天前
Android7 SystemUI 源码解析(二)启动流程深度解析
android·systemui