java序列化

Java和Android序列化总结

1. 序列化概述

1.1 什么是序列化?

序列化是指将对象的状态信息转换为可以存储或传输的形式的过程。反序列化则是将存储或传输的数据重新转换为对象的过程。序列化主要用于对象的持久化、对象的远程传输等场景。

1.2 为什么需要序列化?

  • 持久化:将对象保存到文件或数据库中,以便后续使用。
  • 网络传输:将对象通过网络传输到其他系统或设备。
  • 共享对象:在多个进程中共享对象。

2. Java序列化

2.1 Serializable 接口

Java 提供了 Serializable 接口来实现对象的序列化。任何实现了 Serializable 接口的类都可以被序列化。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import java.io.Serializable;

public class User implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
private int age;

public User(String name, int age) {
this.name = name;
this.age = age;
}

// Getters and Setters
}
JAVA

2.2 序列化和反序列化

使用 ObjectOutputStreamObjectInputStream 进行序列化和反序列化。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import java.io.*;

public class SerializationExample {
public static void main(String[] args) {
User user = new User("John Doe", 30);

// 序列化
try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("user.ser"))) {
oos.writeObject(user);
System.out.println("User object serialized.");
} catch (IOException e) {
e.printStackTrace();
}

// 反序列化
try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("user.ser"))) {
User deserializedUser = (User) ois.readObject();
System.out.println("User object deserialized: " + deserializedUser.getName() + ", " + deserializedUser.getAge());
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
JAVA

2.3 transient 关键字

使用 transient 关键字可以标记不希望被序列化的字段。

示例

1
2
3
4
5
6
7
8
9
10
11
12
public class User implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
private transient int age;

public User(String name, int age) {
this.name = name;
this.age = age;
}

// Getters and Setters
}
JAVA

2.4 自定义序列化

通过实现 writeObjectreadObject 方法来自定义序列化过程。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import java.io.*;

public class User implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
private int age;

public User(String name, int age) {
this.name = name;
this.age = age;
}

private void writeObject(ObjectOutputStream oos) throws IOException {
oos.defaultWriteObject();
oos.writeInt(age * 2); // 自定义序列化
}

private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException {
ois.defaultReadObject();
age = ois.readInt() / 2; // 自定义反序列化
}

// Getters and Setters
}
JAVA

3. Android序列化

3.1 Parcelable 接口

Android 提供了 Parcelable 接口来实现更高效的序列化。ParcelableSerializable 更轻量级,性能更好。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import android.os.Parcel;
import android.os.Parcelable;

public class User implements Parcelable {
private String name;
private int age;

public User(String name, int age) {
this.name = name;
this.age = age;
}

protected User(Parcel in) {
name = in.readString();
age = in.readInt();
}

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];
}
};

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

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

// Getters and Setters
}
JAVA

3.2 使用 Bundle 传递 Parcelable 对象

在 Android 中,可以使用 BundleParcelable 对象传递给其他组件。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 创建 User 对象
User user = new User("John Doe", 30);

// 将 User 对象放入 Bundle
Bundle bundle = new Bundle();
bundle.putParcelable("user", user);

// 通过 Intent 传递 Bundle
Intent intent = new Intent(this, NextActivity.class);
intent.putExtras(bundle);
startActivity(intent);

// 在 NextActivity 中获取 User 对象
User user = getIntent().getExtras().getParcelable("user");
JAVA

3.3 Serializable vs Parcelable

  • 性能Parcelable 性能更好,因为它不涉及反射。
  • 复杂性Serializable 更简单,但 Parcelable 需要更多的代码。
  • 使用场景Serializable 适用于简单的对象,Parcelable 适用于复杂的对象和频繁的序列化操作。

4. 序列化的优缺点

4.1 优点

  • 持久化:可以将对象状态保存到文件或数据库中。
  • 网络传输:可以将对象通过网络传输到其他系统或设备。
  • 共享对象:可以在多个进程中共享对象。

4.2 缺点

  • 性能Serializable 性能较差,涉及反射和大量的 I/O 操作。
  • 安全性:序列化后的数据容易被篡改,需要额外的安全措施。
  • 版本兼容性:对象的序列化格式可能会随类的变更而变化,导致反序列化失败。

5. 总结

序列化是将对象状态转换为可存储或传输形式的重要技术。Java 提供了 Serializable 接口,而 Android 提供了 Parcelable 接口来实现序列化。Serializable 简单易用,但性能较差;Parcelable 性能更好,但需要编写更多的代码。根据具体需求选择合适的序列化方式,可以有效提升应用的性能和可靠性。


java序列化
https://tangerine-kitten-lux.netlify.app/java序列化/
作者
lux
发布于
2024年11月20日
许可协议