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