序列化之Serializable与Parcelable
2023-09-11 14:31:44
前言
在Java中,对象是程序的基本组成单位。对象可以包含数据和方法,并可以相互通信。当我们需要将对象在网络上传输或存储在文件中时,就需要用到序列化技术。序列化可以将对象转换为字节序列,以便于在网络上传输或存储在文件中。反序列化则是将字节序列转换回对象的过程。
Java中提供了两种序列化技术:Serializable和Parcelable。Serializable是Java内置的序列化技术,它通过将对象转换为字节序列来实现序列化。Parcelable是Android平台提供的序列化技术,它通过将对象转换为Parcel对象来实现序列化。
Serializable
Serializable是一个Java内置的序列化接口。当一个类实现了Serializable接口,就可以通过ObjectOutputStream将对象转换为字节序列,也可以通过ObjectInputStream将字节序列转换为对象。
使用Serializable序列化对象
要使用Serializable序列化对象,需要先在类中实现Serializable接口。然后,就可以通过ObjectOutputStream将对象转换为字节序列。如下所示:
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
public class Main {
public static void main(String[] args) {
// 创建一个Person对象
Person person = new Person("张三", 20);
// 将Person对象序列化到文件中
try (FileOutputStream fos = new FileOutputStream("person.dat");
ObjectOutputStream oos = new ObjectOutputStream(fos)) {
oos.writeObject(person);
} catch (Exception e) {
e.printStackTrace();
}
}
}
使用Serializable反序列化对象
要使用Serializable反序列化对象,需要先从文件中读取字节序列,然后通过ObjectInputStream将字节序列转换为对象。如下所示:
import java.io.FileInputStream;
import java.io.ObjectInputStream;
public class Main {
public static void main(String[] args) {
// 从文件中读取Person对象
try (FileInputStream fis = new FileInputStream("person.dat");
ObjectInputStream ois = new ObjectInputStream(fis)) {
Person person = (Person) ois.readObject();
// 输出Person对象的信息
System.out.println(person.getName());
System.out.println(person.getAge());
} catch (Exception e) {
e.printStackTrace();
}
}
}
Parcelable
Parcelable是Android平台提供的序列化技术。Parcelable通过将对象转换为Parcel对象来实现序列化。Parcel对象是一个轻量级的容器,它可以存储各种基本数据类型和对象。
使用Parcelable序列化对象
要使用Parcelable序列化对象,需要先在类中实现Parcelable接口。然后,就可以通过Parcel对象将对象转换为字节序列。如下所示:
import android.os.Parcel;
import android.os.Parcelable;
public class Person implements Parcelable {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name);
dest.writeInt(age);
}
public static final Parcelable.Creator<Person> CREATOR = new Parcelable.Creator<Person>() {
@Override
public Person createFromParcel(Parcel source) {
String name = source.readString();
int age = source.readInt();
return new Person(name, age);
}
@Override
public Person[] newArray(int size) {
return new Person[size];
}
};
}
使用Parcelable反序列化对象
要使用Parcelable反序列化对象,需要先从Parcel对象中读取字节序列,然后通过Parcelable.Creator将字节序列转换为对象。如下所示:
import android.os.Parcel;
public class Main {
public static void main(String[] args) {
// 创建一个Person对象
Person person = new Person("张三", 20);
// 将Person对象序列化到Parcel对象
Parcel parcel = Parcel.obtain();
person.writeToParcel(parcel, 0);
// 从Parcel对象中读取Person对象
parcel.setDataPosition(0);
Person newPerson = Person.CREATOR.createFromParcel(parcel);
// 输出Person对象的信息
System.out.println(newPerson.getName());
System.out.println(newPerson.getAge());
}
}
Serializable和Parcelable的区别
Serializable和Parcelable都是Java中常用的序列化技术,但它们之间还是存在一些区别。
- 序列化方式不同 :Serializable通过将对象转换为字节序列来实现序列化,而Parcelable通过将对象转换为Parcel对象来实现序列化。
- 适用场景不同 :Serializable适用于需要在网络上传输或存储在文件中的对象,而Parcelable适用于需要在Android平台上进行通信的对象。
- 性能不同 :Serializable的性能比Parcelable差,因为Serializable需要将对象转换为字节序列,而Parcelable只需要将对象转换为Parcel对象。
- 兼容性不同 :Serializable的兼容性比Parcelable好,因为Serializable是Java内置的序列化技术,而Parcelable是Android平台提供的序列化技术。
总结
Serializable和Parcelable都是Java中常用的序列化技术,它们都有各自的优点和缺点。在选择序列化技术时,需要根据具体的场景和需求来选择。