Android中数据序列化之Serializable与Parcelable

    xiaoxiao2021-03-25  104

    1、Serializable

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

    public class SerDemo implements Serializable { //开发工具自动生成的SerializableUID private static final long SerializableUID = 4046555564483893194L; private int age; //ArrayList已经实现了序列化接口 private ArrayList<BannerImg> bannerImage; public class BannerImg implements Serializable { private static final long SerializableUID = -344227642091683711L; public String mIconUrl; public string mValue; public BannerImg(String iconUrl,String value) { this.mIconUrl = iconUrl; this.mValue = value; } public SerDemo { this.age = 0; this.bannerImgs = new ArrayList<>(); } }

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

    序列化需要把对象转换成诸如FileOutputStream等输出流,再转成ObjectOutputStream,然后调用相应方法序列化保存到文件。

    private void writeToChche(SerDemo banner) { ObjectOutput objectOutput = null; //判断SD卡时都存在 if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { //将制定Banner对象序列化到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卡不存在 } } //模拟把一个J阿坝对象反序列化 //反序列化需要把文件数据转化成诸如FileInputStream等输入流,再转化成ObjectInputStream,然后调用相应方法转化成对象。 private SerDemo readFromCache() { File file = null; FileInputStream fis= null; ObjectInputStream = null; SerDemo banner = null; if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { //将制定的banner对象序列化到SD卡中 try { //文件路径最好是灵活配置 file = new File(Environment.getExternalStorageDirectory() + "ldm"); //这里还要判断文件是否存在 fis = new FileInputStream(file); ois = new ObjectInputStream(fis); if(null != ois) { banner = (SerDemo)ois.readObject(); } }catch(Exception e) { finally{ try{ if(null != fis) { fis.cloae(); } if(null != ois) { ois.close(); } }catch(IOExceptio e){ e.printStackTrace(); } } } } else { //提示SD卡不存在 } return banner; }

    2、Parcelable Parcelable是AndroidSDK提供的一种机遇内存读写的告诉序列化操作。在Android跨进程数据通讯中,数据对象一般要求实现Parcelable接口,实现Parcelable指定的方法。

    下面通过是Parcelable进行序列化和反序列化Demo:

    public class ParcelDemo implements Parcelable { private String name; private int age; private String subject; public ParcelDemo() { } //从Parcel中获取变量的内容 protected ParcelDemo(Parcel in) { this.name = in.readString(); this.age = in.readInt(); this.subject = 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(subject); } }
    转载请注明原文地址: https://ju.6miu.com/read-19290.html

    最新回复(0)