Android中数据序列化之Serializable与Parcelable

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);

     }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值