android序列化
『壹』 Android是怎麼對對數據源中list<String>欄位進行Parcelable序列化的
ArrayList<String> photos;
寫入
dest.writeStringList(photos);
讀取
this.photos=new ArrayList<>();
in.readStringList(this.photos);
注意加粗地方,另一個人回答錯了!
『貳』 android list可以序列化嗎
public static void main(String[] args) throws IOException{ List list=new ArrayList(); Date now=new Date(); list.add(now); list.add(new Date(now.getTime()+8888888)); ByteArrayOutputStream byteStream=new ByteArrayOutputStream();
『叄』 怎麼序列化android.graphics.Path
繼承 android.graphics.Path 類,重寫 moveTo, lineTo 等方法,記錄下 path 繪制的每一點的左邊數據;反序列化的時候調用 「drawThisPath」 重繪 path。
相關代碼:
public class CustomPath extends Path implements Serializable {
private static final long serialVersionUID = -5974912367682897467L;
private ArrayList<PathAction> actions = new ArrayList<CustomPath.PathAction>();
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException{
in.defaultReadObject();
drawThisPath();
}
@Override
public void moveTo(float x, float y) {
actions.add(new ActionMove(x, y));
super.moveTo(x, y);
}
『肆』 如何用Android studio快速實現對象的序列化介面
方法/步驟
1、在線安裝
從Android studio的菜單欄里選擇「Preferences」,然後點擊「Plugins」選擇底部的「Browser repositories」然後再搜索框中輸入parcelable,按回車之後選擇搜索結果的第一個,android parcelable code generator點擊右邊的「install plugin」按鈕進行安裝即可。
2、由於網路原因有些用戶可能無法使用在線安裝,這里提供離線安裝步驟
打開網路直接搜索「plugins jetbrains」第一個就是。打開官網,在搜索欄里搜索關鍵字:parcelable,點擊「go」進行搜索。
3、看到搜索結果,點擊第二個,android parcelable code generator
4、看到最新版本為0.6.2,點擊「Download」,下載plugin的jar文件。
5、從Android studio的菜單欄里選擇「Preferences」,然後點擊「Plugins」,從底部選擇「install plugin from disk...」找到下載的文件android-parcelable-intellij-plugin.jar選擇「choose」即可
7、在entity包下新建一個測試的實體類:Person.java 添加三個私有變數lastName,firstName,age;並設置添加其get set方法。
8、在Person.java 文件中,空白地方滑鼠右擊,選擇「Generat...」然後選擇「parcelable」之後選擇需要序列化的欄位,點擊「OK」
『伍』 java android 實現parcelable序列化,為什麼必須要實現CREATOR
你好:
Android序列化對象主要有兩種方法,實現Serializable介面、或者實現Parcelable介面。實現Serializable介面是Java SE本身就支持的,而Parcelable是Android特有的功能,效率比實現Serializable介面高,而且還可以用在IPC中。實現Serializable介面非常簡單,聲明一下就可以了,而實現Parcelable介面稍微復雜一些,但效率更高,推薦用這種方法提高性能。下面就介紹一下實現Parcelable介面的方法
通過實現Parcelable介面序列化對象的步驟:
1、聲明實現介面Parcelable
2、實現Parcelable的方法writeToParcel,將你的對象序列化為一個Parcel對象
3、實例化靜態內部對象CREATOR實現介面Parcelable.Creator:
Java代碼
public static final Parcelable.Creator<T> CREATOR
其中public static final一個都不能少,內部對象CREATOR的名稱也不能改變,必須全部大寫。
4、完成CREATOR的代碼,實現方法createFromParcel,將Parcel對象反序列化為你的對象
簡而言之:通過writeToParcel將你的對象映射成Parcel對象,再通過createFromParcel將Parcel對象映射成你的對象。也可以將Parcel看成是一個流,通過writeToParcel把對象寫到流裡面,在通過createFromParcel從流里讀取對象,只不過這個過程需要你來實現,因此寫的順序和讀的順序必須一致。
Parcel對象可以通過以下方法寫入或讀取byte, double, float, int, long, String這6種類型變數。
『陸』 Android兩種序列化的區別和作用
對於Serializable,類只需要實現Serializable介面,並提供一個序列化版本id(serialVersionUID)即可。而Parcelable則需要實現writeToParcel、describeContents函數以及靜態的CREATOR變數,實際上就是將如何打包和解包的工作自己來定義,而序列化的這些操作完全由底層實現。
『柒』 android內部類怎麼序列化
非靜態內部類的實例,會隱含保存一個指向其外部類實例的引用。如果進行序列化,估計會有問題。
如果有可能的話,對於需要序列化的實例,最好不要使用非靜態的內部類
『捌』 android 序列化怎麼使用
Android 中實現序列化有兩個選擇:
一是實現Serializable介面(是JavaSE本身就支持的),
一是實現Parcelable介面(是Android特 有功能,效率比實現Serializable介面高效,可用於Intent數據傳遞,也可以用於進程間通信(IPC))。
實現Serializable接 口非常簡單,聲明一下就可以了,而實現Parcelable介面稍微復雜一些,但效率更高,推薦用這種方法提高性能。
選擇序列化方法的原則
1)在使用內存的時候,Parcelable比Serializable性能高,所以推薦使用Parcelable。
2)Serializable在序列化的時候會產生大量的臨時變數,從而引起頻繁的GC。
3)Parcelable不能使用在要將數據存儲在磁碟上的情況,因為Parcelable不能很好的保證數據的持續性在外界有變化的情況下。盡管Serializable效率低點,但此時還是建議使用Serializable
『玖』 Android Parcelable和Serializable的區別
本文主要介紹Parcelable和Serializable的作用、效率、區別及選擇,關於Serializable的介紹見Java 序列化的高級認識。
1、作用
Serializable的作用是為了保存對象的屬性到本地文件、資料庫、網路流、rmi以方便數據傳輸,當然這種傳輸可以是程序內的也可以是兩個程序間的。而Android的Parcelable的設計初衷是因為Serializable效率過慢,為了在程序內不同組件間以及不同Android程序間(AIDL)高效的傳輸數據而設計,這些數據僅在內存中存在,Parcelable是通過IBinder通信的消息的載體。
從上面的設計上我們就可以看出優劣了。
2、效率及選擇
Parcelable的性能比Serializable好,在內存開銷方面較小,所以在內存間數據傳輸時推薦使用Parcelable,如activity間傳輸數據,而Serializable可將數據持久化方便保存,所以在需要保存或網路傳輸數據時選擇Serializable,因為android不同版本Parcelable可能不同,所以不推薦使用Parcelable進行數據持久化
3、編程實現
對於Serializable,類只需要實現Serializable介面,並提供一個序列化版本id(serialVersionUID)即可。而Parcelable則需要實現writeToParcel、describeContents函數以及靜態的CREATOR變數,實際上就是將如何打包和解包的工作自己來定義,而序列化的這些操作完全由底層實現。
Parcelable的一個實現例子如下
[java] view plain print?
public class MyParcelable implements Parcelable {
private int mData;
private String mStr;
public int describeContents() {
return 0;
}
// 寫數據進行保存
public void writeToParcel(Parcel out, int flags) {
out.writeInt(mData);
out.writeString(mStr);
}
// 用來創建自定義的Parcelable的對象
public static final Parcelable.Creator<MyParcelable> CREATOR
= new Parcelable.Creator<MyParcelable>() {
public MyParcelable createFromParcel(Parcel in) {
return new MyParcelable(in);
}
public MyParcelable[] newArray(int size) {
return new MyParcelable[size];
}
};
// 讀數據進行恢復
private MyParcelable(Parcel in) {
mData = in.readInt();
mStr = in.readString();
}
}
public class MyParcelable implements Parcelable {
private int mData;
private String mStr;
public int describeContents() {
return 0;
}
// 寫數據進行保存
public void writeToParcel(Parcel out, int flags) {
out.writeInt(mData);
out.writeString(mStr);
}
// 用來創建自定義的Parcelable的對象
public static final Parcelable.Creator<MyParcelable> CREATOR
= new Parcelable.Creator<MyParcelable>() {
public MyParcelable createFromParcel(Parcel in) {
return new MyParcelable(in);
}
public MyParcelable[] newArray(int size) {
return new MyParcelable[size];
}
};
// 讀數據進行恢復
private MyParcelable(Parcel in) {
mData = in.readInt();
mStr = in.readString();
}
}
從上面我們可以看出Parcel的寫入和讀出順序是一致的。如果元素是list讀出時需要先new一個ArrayList傳入,否則會報空指針異常。如下:
list = new ArrayList<String>();
in.readStringList(list);
PS: 在自己使用時,read數據時誤將前面int數據當作long讀出,結果後面的順序錯亂,報如下異常,當類欄位較多時務必保持寫入和讀取的類型及順序一致。
11-21 20:14:10.317: E/AndroidRuntime(21114): Caused by: java.lang.RuntimeException: Parcel android.os.Parcel@4126ed60: Unmarshalling unknown type code 3014773 at offset 164
4、高級功能上
Serializable序列化不保存靜態變數,可以使用Transient關鍵字對部分欄位不進行序列化,也可以覆蓋writeObject、readObject方法以實現序列化過程自定義
『拾』 android 序列化傳遞對象是同一個對象嗎
putSerializable,是通過對象的序列化和反序列化來實現Activity之間對象的傳遞的,所以這種方法得到的就是兩個完全不一樣的對象(Activity2中的對象obj就相當於new了一個新對象,然後將Activity1中的對象obj的值都賦給了它,所以可以說它們的內容是一樣的,但是對象不一樣.). 注:通過上述方法傳遞的對象obj一定要實現Serializable介面才可以哦! 一般在Activity之間是不做對象的傳遞的吧,序列化和反序列化本身就沒有一定的弊端吧(個人感覺),呵呵...而且對象都要實現Serializable介面. 如果一定要傳對象的話可以在做一些靜態的類或對象! 希望對你有幫助 ^_^!