Android序列化的幾種實現方式
阿新 • • 發佈:2022-04-07
一、Serializable序列化
Serializable是java提供的一種序列化方式,其使用方式非常簡單,只需要實現Serializable介面就可以實現序列化.
public interface Serializable {
}
1.Serializable使用
import java.io.Serializable; public class Person implements Serializable { //如果不定義,系統會自動生成一個 //一般來說,我們需要手動指定,當反序列化時,如果類發生了改變,比如增加或刪除了某些成員變數,系統重新計算serialVersionUID的值 //這個時候,儲存在檔案中的那個物件的serialVersionUID值和當前類的serialVersionUID值已經不一致了,會導致序列化失敗 //如果你修改了類名,或者成員變數的資料型別,也是會序列化失敗,因為結構已經發生了根本性的改變 private final static long serialVersionUID = 1L; //transient和static修飾的成員變數不會參與序列化 private transient int verson; public String name; public int age; }
public static void main(String[] args){ Person person = new Person(); person.name = "miku"; person.age = 18; try { //將物件儲存到本地檔案 try (ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("D:\\person.obj"))) { objectOutputStream.writeObject(person); } //將儲存到本地檔案的物件反序列化,轉換成可實際操作的物件 try (ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("D:\\person.obj"))) { Person personWrite = (Person)objectInputStream.readObject(); System.out.println("===========反序列化============="); System.out.println("name:" + personWrite.name); System.out.println("age:" + personWrite.age); } } catch (Exception e) { e.printStackTrace(); } }
2.Serializable的優缺點
優點:
a.Serializable支援將物件儲存到本地檔案中,持久化儲存
b.使用方便,應該是最方便的一種序列化方式了
缺點:
a.效能開銷(cpu和磁碟讀寫)佔用過高
b.安全性不強,用文字編輯器甚至能看到部分資料
二 、Externalizable序列化
Externalizable和Serializable區別其實不大,只是比Serializable多了自定義序列化的選擇而已,因為Externalizable是繼承自
Serializable介面多了一個讀、寫的方法而已.Externalizable可以自由選擇哪些變數可以被序列化.
public interface Externalizable extends java.io.Serializable {
void writeExternal(ObjectOutput out) throws IOException;
void readExternal(ObjectInput in) throws IOException, ClassNotFoundException;
}
1.Externalizable的使用
public class User implements Externalizable{
public String name;
public int age;
@Override
public void writeExternal(ObjectOutput out) throws IOException {
//注意,寫入的順序和讀取的順序要一致,比如我先寫入name,後寫入age
//那麼readExternal()讀取的時候也要一致,不然會拋異常
out.writeObject("writeUser");
out.writeInt(18);
}
@Override
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
this.name = (String)in.readObject();
this.age = in.readInt();
}
}
public static void main(String[] args) {
User user = new User();
user.name = "miku";
user.age = 16;
System.out.println("==========序列化之前===========");
System.out.println("name: " + user.name);
System.out.println("age: " + user.age);
try {
//將物件儲存到檔案
try (ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("D:\\user.obj"))) {
objectOutputStream.writeObject(user);
}
//將儲存到檔案的物件反序列化,還原成記憶體中的物件
try (ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("D:\\user.obj"))) {
User userWrite = (User)objectInputStream.readObject();
System.out.println("=============序列化之後==========");
System.out.println("name:" + userWrite.name);
System.out.println("age:" + userWrite.age);
}
} catch (Exception e) {
e.printStackTrace();
}
}
2.Externalizable的優缺點
與Serializable一致,只不過比Serializable多了一個自定義序列化的過程,可人為控制
三、Parcelable
Parcelable其實是安卓系統提供的一種記憶體資料傳遞的實現,嚴格來說並不能算是序列化,因為它只存在於
記憶體,無法持久化儲存
官方文件介紹:
[Parcelable](https://developer.android.google.cn/guide/components/activities/parcelables-and-bundles?hl=zh_cn#kotlin)
public interface Parcelable {
public void writeToParcel(Parcel dest, @WriteFlags int flags);
public interface Creator<T> {
public T createFromParcel(Parcel source);
public T[] newArray(int size);
}
public interface ClassLoaderCreator<T> extends Creator<T> {
public T createFromParcel(Parcel source, ClassLoader loader);
}
}
1.Parcelable的使用
public class Person implements Parcelable {
public String name;
public int age;
public int type;
public Object obj;
public Person user;
public Person(){
}
//出來實現介面提供的方法,還需要定義一個Parcel引數的建構函式CREATOR 呼叫
//讀取的順序要和寫入的順序一致,比如 type,name,age,那麼writeToParcel()方法
//中的順序也要一致
private Person(Parcel in) {
type = in.readInt();
name = in.readString();
age = in.readInt();
user = in.readParcelable(Thread.currentThread().getContextClassLoader());
}
public static final Creator<Person> CREATOR = new Creator<Person>() {
@Override
public Person createFromParcel(Parcel in) {
return new Person(in);
}
@Override
public Person[] newArray(int size) {
return new Person[size];
}
};
//預設返回0就可以了
//官方文件:https://developer.android.com/reference/android/os/Parcelable.html#CONTENTS_FILE_DESCRIPTOR
@Override
public int describeContents() {
return 0;
}
//將資料寫入到Parcel
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(type);
dest.writeString(name);
dest.writeInt(age);
dest.writeParcelable(user,0);
}
}
Person person = new Person();
person.name = "miku";
person.age = 16;
person.type = 1;
//直接通過intent傳遞
Intent intent = new Intent(this,xxx.class);
intent.putExtra("user", person);
startActivity(intent);
xxxActivity.java
Person person = (Person) getIntent().getParcelableExtra("user")
2.Parcelable的優缺點
優點:
a.效能效率都比Serializable高,據說比Serializable快10倍...
b.因為資料都存在於記憶體,安全性要比Serializable
缺點:
a.Parcelable無法持久化儲存,只能存在於記憶體
b.資料大小限制為~KB,超過會拋[TransactionTooLargeException](https://developer.android.google.cn/reference/android/os/TransactionTooLargeException?hl=zh-cn)異常