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