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插件,
就会在提示生成方法时自动添加对应代码,非常方便。