返回

序列化之Serializable与Parcelable

Android

前言

在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中常用的序列化技术,它们都有各自的优点和缺点。在选择序列化技术时,需要根据具体的场景和需求来选择。