Android

Android中Serializable和Parcelable接

2019-01-28  本文已影响14人  MoonJoy

Android中实现序列化有两个选择:一个是实现Serializable接口,Java提供的一个序列化接口;另一个是实现Parcelable接口,Android特有的序列化接口,效率比实现Serializable接口高效,可用于Intent数据传递,也可以用于进程间通信(IPC)。

序列化和反序列化

序列化应用场景

Serializable序列化ID:

序列化ID serialVersionUID的值可以是固定的1L,也可以是随机生成一个不重复的long类型数据,甚至可以不声明也可以实现序列化。但是会对反序列化过程产生影响,因为不同的序列化ID之间不能进行序列化和反序列化。

Serializable实现序列化步骤

Serializable实现反序列化步骤

注意:

Serializable代码实例:

public class Person implements Serializable {
    private static final long serialVersionUID = 1L;

    private String name;
    private int age;

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name= name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

// Serializable:把对象序列化
public static void writeSerializableObject() {
    try {
        Person person = new Person("Mary", 18);
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("output.txt"));
        objectOutputStream.writeObject(person);
        objectOutputStream.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

// Serializable:反序列化对象
public static void readSerializableObject() {
    try {
        ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("output.txt"));
        Person person = (Person) objectInputStream.readObject();
        objectInputStream.close();
        System.out.println("name = " + person.getName() + ", age = " + person.getAge());
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

Parcelable接口定义

public interface Parcelable 
{
    //内容描述接口,基本不用管
    public int describeContents();
    //写入接口函数,打包
    public void writeToParcel(Parcel dest, int flags);
    //读取接口,目的是要从Parcel中构造一个实现了Parcelable的类的实例处理。因为实现类在这里还是不可知的,所以需要用到模板的方式,继承类名通过模板参数传入
    //为了能够实现模板参数的传入,这里定义Creator嵌入接口,内含两个接口函数分别返回单个和多个继承类实例
    public interface Creator<T> 
    {
           public T createFromParcel(Parcel source);
           public T[] newArray(int size);
    }
}

Parcelable实现序列化步骤

public static final Parcelable.Creator<T> CREATOR

Parcelable代码实例:

public class Person implements Parcelable 
{
     private String name;
     private String sex;
     private int age;

     public int describeContents() 
     {
         return 0;
     }

     public void writeToParcel(Parcel out, int flags) 
     {
         out.writeString(name);
         out.writeString(sex);
         out.writeInt(age);
     }

     public static final Parcelable.Creator<Person> CREATOR = new Parcelable.Creator<Person>() 
     {
         public Person createFromParcel(Parcel in) 
         {
             return new Person(in);
         }

         public Person[] newArray(int size) 
         {
             return new Person[size];
         }
     };
     
     private Person(Parcel in) 
     {
        name = in.readString();
        sex = in.readString();
         age = in.readInt();
     }
 }

Serializable和Parcelable对比

上一篇下一篇

猜你喜欢

热点阅读