最新消息:欢迎访问Android开发中文站!商务联系QQ:1304524325

Android中数据序列化之Serializable与Parcelable

新手入门 loading 1738浏览 0评论

1.Serializable

序列化Serializable是Java语言的特性之一,是将java对象转换成字节序列的过程,与之对应的是反序列化。反序列化是将字节序列转化为java对象的过程。  
 Serializable通过实现接口进行标志,只要定义的Java对象实现了Serializable接口,不有实现任何方法,java就会对该对象
诸如对如下类进行序列化及反序列化操作

public class SerDemo implements Serializable {
   //开发工具提示生成的serialVersionUID 
    private static final long serialVersionUID = 4046555564483893134L;
    private int age;
    //ArrayList已经实现了序列化接口
    private ArrayList<BannerImg> bannerImgs;

    public class BannerImg implements Serializable {
        private static final long serialVersionUID = -344227642091683711L;
        public String mIconUrl;
        public String mValue;

        public BannerImg(String mIconUrl, String mValue) {
            this.mIconUrl = mIconUrl;
            this.mValue = mValue;
        }
    }

    public SerDemo() {
        this.age = 0;
        this.bannerImgs = new ArrayList<>();
    }
}

对SerDemo进行序列化及反序列化操作示例:

//序列化需要把对象转换成诸如FileOutputSream等输出流,再转成ObjectOutputSteam,然后调用相应方法序列化保存到文件。
    private void writeToCache(SerDemo banner) {
        FileOutputStream fos = null;
        ObjectOutput objectOutput = null;
        //判断sd卡是否存在
        if (Environment.getExternalStorageState()
                .equals(android.os.Environment.MEDIA_MOUNTED)) {
            //将指定WenkuBanner对象序列化到SD卡中
            try {
                //文件路径最好是灵活配置
                File file = new File(Environment.getExternalStorageDirectory() + "/ldm");
                fos = new FileOutputStream(file);
                objectOutput = new ObjectOutputStream(fos);
                if (objectOutput != null) {
                    objectOutput.writeObject(banner);
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {
                    if (null != fos) {
                        fos.close();
                    }
                    if (null != objectOutput) {
                        objectOutput.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        } else {
            //提示SD卡不存在
        }
    }

    //模拟把一个Java对象反序列化
    //反序列化需要把文件数据转换成诸如FileInputSream等输入流,再转成ObjectInputSteam,然后调用相应方法转成对象。
    private SerDemo readFromCache() {
        File file = null;
        FileInputStream fis = null;
        ObjectInputStream ois = null;
        SerDemo banner = null;
        if (Environment.getExternalStorageState()
                .equals(android.os.Environment.MEDIA_MOUNTED)) {
            //将指定WenkuBanner对象序列化到SD卡中
            try {
                //文件路径最好是灵活配置
                file = new File(Environment.getExternalStorageDirectory() + "/ldm");
                //这里还要判断文件是否存在
                fis = new FileInputStream(file);
                ois = new ObjectInputStream(fis);
                if (null != ois) {
                    //获取到WenkuBanner对象
                    banner = (SerDemo) ois.readObject();
                }

            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {
                    if (null != fis) {
                        fis.close();
                    }
                    if (null != ois) {
                        ois.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        } else {
            //提示SD卡不存在
        }
        return banner;
    }
  • Parcelable
    Parcelable是AndroidSDK提供的一种基于内存读写的高速序列化操作。在Android跨进程数据通讯中 数据对象一般要求实现Parcelable接口,实现Parcelable指定的方法。
    比如对下面类通过Parcelable进行序列化及反序列化
public class ParcelDemo implements Parcelable {
    private String name;
    private int age;
    private String subjcet;

    public ParcelDemo() {
    }

    //从Parcel中获取变量的内容
    protected ParcelDemo(Parcel in) {
        this.name = in.readString();
        this.age = in.readInt();
        this.subjcet = in.readString();
    }

    public static final Creator<ParcelDemo> CREATOR = new Creator<ParcelDemo>() {
        //反序列化方法,将writeToParcel方法写入的Parcel反序列成ParcelDemo
        @Override
        public ParcelDemo createFromParcel(Parcel in) {
            return new ParcelDemo(in);
        }

        //这个方法是提供给其它类反序列化该类的数组时调用
        @Override
        public ParcelDemo[] newArray(int size) {
            return new ParcelDemo[size];
        }
    };

    //接口内容描述 ,通常返回0即可
    @Override
    public int describeContents() {
        return 0;
    }

    //实现序列化操作的方法,将类数据写到Parcel窗口中
    @Override
    public void writeToParcel(Parcel parcel, int i) {
        parcel.writeString(name);
        parcel.writeInt(age);
        parcel.writeString(subjcet);
    }
}

  开发工具实现Parcelable只会提示你要实现的方法,如果在AndroidStuiod中安装了Parcelable Code Generator插件,
  就会在提示生成方法时自动添加对应代码,非常方便。

转载请注明:Android开发中文站 » Android中数据序列化之Serializable与Parcelable

您必须 登录 才能发表评论!