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

相关推荐
东莞梦幻科技1 小时前
体育直播系统趣猜功能开发技术实现方案
android
姜行运1 小时前
数据结构入门【算法复杂度】
android·c语言·数据结构·算法
二流小码农1 小时前
鸿蒙开发:父组件如何调用子组件中的方法?
android·ios·harmonyos
张风捷特烈2 小时前
Flutter 知识集锦 | 获取函数调用栈
android·flutter·dart
故事与他6458 小时前
Thinkphp(TP)框架漏洞攻略
android·服务器·网络·中间件·tomcat
每次的天空10 小时前
项目总结:GetX + Kotlin 协程实现跨端音乐播放实时同步
android·开发语言·kotlin
m0_7482331712 小时前
SQL之delete、truncate和drop区别
android·数据库·sql
CYRUS_STUDIO14 小时前
OLLVM 增加 C&C++ 字符串加密功能
android·c++·安全
帅次15 小时前
Flutter 输入组件 Radio 详解
android·flutter·ios·kotlin·android studio
&有梦想的咸鱼&16 小时前
Android Compose 框架的状态与 ViewModel 的协同(collectAsState)深入剖析(二十一)
android