摘要:在Android开发中,数据序列化是绕不开的“关卡”。它就像数据的“变形记”,能让对象在内存、磁盘和网络间自由穿梭。但面对琳琅满目的序列化方案,开发者常常陷入选择困难。今天,我们就来一场“序列化大揭秘”,帮你找到最适合的方案!
在Android开发中,数据序列化是绕不开的“关卡”。它就像数据的“变形记”,能让对象在内存、磁盘和网络间自由穿梭。但面对琳琅满目的序列化方案,开发者常常陷入选择困难。今天,我们就来一场“序列化大揭秘”,帮你找到最适合的方案!
一、什么是数据序列化?
简单来说,序列化就是把对象“打包”成字节流,方便存储或传输;反序列化则是把字节流“拆包”还原成对象。比如:
持久化存储:保存用户设置到本地文件。
网络传输:把用户数据发送给服务器。
进程间通信:在Activity间传递复杂对象。
二、Android序列化“六大法宝” + 代码示例1. Serializable(Java原生方案)优点:实现超简单,只需声明接口,适合新手。
缺点:性能差、易触发GC,就像“龟速快递”。
适用场景:简单对象持久化,如缓存小文件。
// 实现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传参,列表数据滑动。
public class User implements Parcelable {private String name;private int age;// 必须实现的CREATORpublic static final Creator CREATOR = new Creator { @Overridepublic User createFromParcel(Parcel in) {return new User(in);}@Overridepublic User newArray(int size) {return new User[size];}};// 从Parcel读取数据private User(Parcel in) {name = in.readString;age = in.readInt;}@Overridepublic void writeToParcel(Parcel dest, int flags) {dest.writeString(name);dest.writeInt(age);}@Overridepublic int describeContents {return 0;}}// 使用Intent传递Parcelable对象Intent intent = new Intent(this, TargetActivity.class);intent.putExtra("user", user);startActivity(intent);3. JSON序列化(Gson库示例)优点:可读性强,像“国际通用语言”一样方便。
缺点:解析慢、占内存,大对象处理需谨慎。
适用场景:网络API交互,跨平台数据交换。
// 添加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(性能怪兽)缺点:学习成本高,像“外星科技”需要适应。
适用场景:游戏状态同步、高频数据交换。
// 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
持久化存储(如配置文件)→Serializable或JSON
网络交互(如API请求)→JSON
高性能场景(如游戏)→FlatBuffers
结构化数据(如用户表)→SQLite/Room
四、实战案例:混合使用更灵活商品列表用Parcelable快速滑动加载。
用户订单存到SQLite数据库。
支付信息用JSON加密传输到服务器。
游戏道具用FlatBuffers实现实时同步。
总结没有“银弹”,只有最合适的方案。理解每种序列化的优缺点,结合项目需求灵活选择,才能让数据“活”起来,让APP更高效!
来源:小陈科技讲堂