Android中數據序列化之Serializable與Parcelable
-
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<>();
}
}</code></pre>
對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;
}</code></pre>
-
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插件,
就會在提示生成方法時自動添加對應代碼,非常方便。</code></pre>
來自:http://www.androidchina.net/6560.html
本文由用戶 fdsfsdjf3 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!