Android数据对象序列化原理与应用( 二 )


public class MyClass implements Parcelable {// 类的成员变量和方法protected MyClass(Parcel in) {// 从Parcel中读取数据并赋值给成员变量}public static final Creator<MyClass> CREATOR = new Creator<MyClass>() {@Overridepublic MyClass createFromParcel(Parcel in) {return new MyClass(in);}@Overridepublic MyClass[] newArray(int size) {return new MyClass[size];}};@Overridepublic int describeContents() {return 0;}@Overridepublic void writeToParcel(Parcel dest, int flags) {// 将成员变量写入Parcel}}(3) 使用Gson库:Gson是google提供的一个用于在JAVA对象和JSON数据之间进行序列化和反序列化的库 。可以使用Gson将对象转换为JSON字符串,然后再将JSON字符串转换为对象 。示例代码如下:
public class MyClass {// 类的成员变量和方法public static void main(String[] args) {// 序列化对象MyClass obj = new MyClass();Gson gson = new Gson();String json = gson.toJson(obj);System.out.println("对象已序列化为JSON字符串:" + json);// 反序列化对象MyClass newObj = gson.fromJson(json, MyClass.class);System.out.println("JSON字符串已反序列化为对象");}}序列化原理「Serializable」是Java中的一个接口,用于实现对象的序列化和反序列化 。序列化是指将对象转换为字节流的过程,而反序列化则是将字节流转换为对象的过程 。
Serializable接口没有任何方法,它只是一个标记接口,用于告诉Java虚拟机,该类可以被序列化 。要实现序列化,只需要让类实现Serializable接口即可 。
在序列化过程中,Java虚拟机会将对象的状态转换为字节序列,然后可以将字节序列保存到文件、数据库或通过网络传输 。反序列化过程则是将字节序列重新转换为对象的状态 。
在序列化过程中,Java虚拟机会对对象的各个字段进行序列化 。对于基本类型和引用类型,Java虚拟机会自动进行序列化 。对于自定义类型,需要实现Serializable接口,并且保证该类型的所有成员变量也是可序列化的 。
在反序列化过程中,Java虚拟机会根据字节序列重新创建对象,并将字节序列中的数据赋值给对象的各个字段 。
需要注意的是,序列化和反序列化的过程中 , 对象的构造函数不会被调用 。因此 , 在反序列化过程中,如果需要进行一些初始化操作,可以使用特殊的方法readObject()来实现 。
总结起来,Serializable接口提供了一种简单的方式来实现对象的序列化和反序列化 。通过实现Serializable接口,可以将对象转换为字节序列,以便在不同的环境中进行传输和存储 。
「Parcelable」是Android中用于实现对象序列化的接口 。它的原理是将对象的数据按照一定的格式进行打包和解包,以便在不同的组件之间传输或存储 。
具体实现步骤如下:

  1. 实现Parcelable接口:在需要序列化的类中实现Parcelable接口,并实现其中的方法 , 包括describeContents()和writeToParcel(Parcel dest, int flags) 。
  2. describeContents()方法:该方法返回一个标志位,用于描述Parcelable对象特殊对象的类型 。一般情况下,返回0即可 。
  3. writeToParcel(Parcel dest, int flags)方法:该方法将对象的数据写入Parcel对象中 。在该方法中,需要将对象的各个字段按照一定的顺序写入Parcel对象中,以便在解包时按照相同的顺序读取 。
  4. 实现Parcelable.Creator接口:在需要序列化的类中实现Parcelable.Creator接口 , 并实现其中的方法,包括createFromParcel(Parcel source)和newArray(int size) 。
  5. createFromParcel(Parcel source)方法:该方法从Parcel对象中读取数据,并创建出Parcelable对象 。在该方法中,需要按照写入Parcel对象时的顺序读取数据 , 并将其赋值给相应的字段 。
  6. newArray(int size)方法:该方法返回一个指定大小的Parcelable数组 。
通过实现Parcelable接口 , 可以将对象的数据打包成一个Parcel对象,然后可以通过Intent传递给其他组件 , 或者通过Bundle存储到本地 。在接收端,可以通过读取Parcel对象的数据,重新构建出原始的对象 。
总结起来,Parcelable的原理就是将对象的数据按照一定的格式进行打包和解包 , 以实现对象的序列化和反序列化 。这种方式相对于Java中的Serializable接口,更加高效和灵活 。
Serializable/Parcelable对比Serializable和Parcelable都是用于实现对象的序列化和反序列化的接口,但在实现方式和性能方面有所不同 。


推荐阅读