在Android开发中,对象序列化通常指的是将一个对象的状态转换为字节流,以便它可以被存储(例如,在文件或数据库中)或通过网络发送。反序列化则是将这些字节流恢复回原始对象状态的过程。
Java提供了两种主要的序列化机制:通过实现java.io.Serializable接口或使用java.io.Externalizable接口。在Android中,你通常会使用Serializable接口,因为它更简单并且适用于大多数情况。
使用Serializable接口进行序列化
- 实现
Serializable接口:
要使一个类可序列化,只需实现Serializable接口。这个接口是一个标记接口,没有需要实现的方法。
public class MyData implements Serializable {
private String name;
private int age;
// 构造器、getter和setter方法
// Serializable接口不需要实现任何方法
}
- 序列化对象:
使用ObjectOutputStream将对象写入输出流(如文件输出流)。
try (FileOutputStream fos = openFileOutput("my_data.dat", Context.MODE_PRIVATE);
ObjectOutputStream oos = new ObjectOutputStream(fos)) {
MyData data = new MyData();
data.setName("John Doe");
data.setAge(30);
oos.writeObject(data);
} catch (IOException e) {
e.printStackTrace();
}
- 反序列化对象:
使用ObjectInputStream从输入流(如文件输入流)中读取对象。
MyData data = null;
try (FileInputStream fis = openFileInput("my_data.dat");
ObjectInputStream ois = new ObjectInputStream(fis)) {
data = (MyData) ois.readObject();
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
// 现在你可以使用data对象了
注意事项
- 序列化过程中,对象的所有非瞬态(即没有用
transient关键字标记的)和非静态字段都将被序列化。 - 如果一个对象包含对其他对象的引用,那么这些对象也会被序列化(除非它们被标记为
transient或实现了某种特定的序列化机制,如Externalizable)。 - 序列化和反序列化可能会抛出
IOException(在读写过程中)和ClassNotFoundException(在反序列化过程中找不到类的定义)。 - 序列化和反序列化可能会消耗较多的资源和时间,因此不应在性能敏感的操作中频繁使用。
- 序列化后的数据通常与Java版本和平台相关,因此,在一个平台上序列化的对象可能无法在另一个平台上反序列化(除非两个平台具有相同的Java版本和库)。
- 对于安全性敏感的数据,不应使用Java序列化,因为它容易受到攻击。相反,应使用更安全、更可控的序列化机制,如JSON、XML或Protocol Buffers。
1064

被折叠的 条评论
为什么被折叠?



