2.3 IPC基礎(chǔ)概念介紹(一)

1. Serializable接口

定義User類证逻,實現(xiàn)Serializable接口

public class User implements Serializable {
    private int userId;
    private String userName;
    // getter setter toString...
}

序列化和反序列化

User user = new User(1, "allen");
File cache = new File(getCacheDir(), "cache.txt");
if (!cache.exists()) {
    cache.createNewFile();
}
// 序列化
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(cache.getAbsoluteFile()));
out.writeObject(user);
out.close();
// 反序列化
ObjectInputStream in = new ObjectInputStream(new FileInputStream(cache.getAbsoluteFile()));
User newUser = (User) in.readObject();
in.close();
Log.e("aaa",newUser.toString());

打印結(jié)果:

06-14 22:32:21.845 20094-20094/qingfengmy.developmentofart E/aaa: User{userId=1, userName='allen'}

如果在序列化完成后铐懊,修改了User的結(jié)構(gòu)还栓,比如去掉了userId字段铡溪。此時再反序列化招拙。報錯如下:

java.io.InvalidClassException: 
qingfengmy.developmentofart._2activity.User; 
Incompatible class (SUID): 
qingfengmy.developmentofart._2activity.User: static final long serialVersionUID =7574333349125611880L; 
but expected qingfengmy.developmentofart._2activity.User: static final long serialVersionUID =8583313061247669989L;

意思是序列化的User的UID是75...L署照;但反序列化期望的是85...L禽作。所以報無效的Class異常镜盯。
如果不刪字段姜钳,而是加了一個字段如isMale坦冠,此時反序列化也會報同樣的錯誤。這里的UID由于我們沒有顯性的指定哥桥,所以在編譯時會自己根據(jù)字段情況生成一個辙浑,字段改變則值改變,所以會報錯拟糕。
如果我們指定UID的值

private static final long serialVersionUID = 1L;

此時不論加字段還是刪字段判呕,由于serialVersionUID一致,反序列化都可以盡可能恢復數(shù)據(jù)送滞。
注意:靜態(tài)變量和用transient(瞬態(tài))修飾的成員變量無法序列化侠草。

在eclipse中很容易的就能自動提示添加serialVersionUID,而在AndroidStudio中卻沒有提示犁嗅,原來是as的檢查配置中默認是關(guān)掉對serialVersionUID的檢查的边涕,那么我們打開就可以。
as->preferences->Inspections->serialization issues->Serializable class without 'serialVersionUID' 勾上確認就可以

2. Parcelable接口

public class User implements Parcelable {
    private int userId;
    private String userName;
    private Book book;
//  getter setter toString...

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeInt(this.userId);
        dest.writeString(this.userName);
        dest.writeParcelable(this.book, flags);
    }

    protected User(Parcel in) {
        this.userId = in.readInt();
        this.userName = in.readString();
        this.book = in.readParcelable(Book.class.getClassLoader());
    }

    public static final Creator<User> CREATOR = new Creator<User>() {
        @Override
        public User createFromParcel(Parcel source) {
            return new User(source);
        }

        @Override
        public User[] newArray(int size) {
            return new User[size];
        }
    };
}

  • 序列化
    序列化方法由writeToParcel實現(xiàn)褂微,具體是調(diào)用Parcel中的write方法功蜓。Parcel內(nèi)部包裝了可序列化的數(shù)據(jù),可以在Binder中自由傳輸宠蚂。
  • 反序列化
    反序列化由Creator完成式撼,其內(nèi)部標明了如何創(chuàng)建序列化對象和數(shù)組,并通過Parcel的一系列read方法來完成反序列化求厕。
  • 內(nèi)容描述
    內(nèi)容描述由describeContents方法完成著隆,通常情況返回0即可。僅當當前對象中存在文件描述符時呀癣,返回1.

需要注意的是User中含有其他對象如Book時美浦,Book也要實現(xiàn)Parcelable接口,并且反序列化時把當前類的類加載器傳過去项栏,否則會報無法找到類的錯誤浦辨。

3. Serializable和Parcelable的選取問題

序列化和反序列化有大量的I/O操作,很耗性能忘嫉。Parcelable比Serializable效率高荤牍,但使用麻煩案腺。Serializable是java中提供的庆冕,Parcelable是android提供的,首選parcelable劈榨。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末访递,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子同辣,更是在濱河造成了極大的恐慌拷姿,老刑警劉巖惭载,帶你破解...
    沈念sama閱讀 221,548評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異响巢,居然都是意外死亡描滔,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評論 3 399
  • 文/潘曉璐 我一進店門踪古,熙熙樓的掌柜王于貴愁眉苦臉地迎上來含长,“玉大人,你說我怎么就攤上這事伏穆【信ⅲ” “怎么了?”我有些...
    開封第一講書人閱讀 167,990評論 0 360
  • 文/不壞的土叔 我叫張陵枕扫,是天一觀的道長陪腌。 經(jīng)常有香客問我,道長烟瞧,這世上最難降的妖魔是什么诗鸭? 我笑而不...
    開封第一講書人閱讀 59,618評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮燕刻,結(jié)果婚禮上只泼,老公的妹妹穿的比我還像新娘。我一直安慰自己卵洗,他們只是感情好请唱,可當我...
    茶點故事閱讀 68,618評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著过蹂,像睡著了一般十绑。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上酷勺,一...
    開封第一講書人閱讀 52,246評論 1 308
  • 那天本橙,我揣著相機與錄音,去河邊找鬼脆诉。 笑死甚亭,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的击胜。 我是一名探鬼主播亏狰,決...
    沈念sama閱讀 40,819評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼偶摔!你這毒婦竟也來了暇唾?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,725評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎策州,沒想到半個月后瘸味,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,268評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡够挂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,356評論 3 340
  • 正文 我和宋清朗相戀三年旁仿,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片孽糖。...
    茶點故事閱讀 40,488評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡丁逝,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出梭姓,到底是詐尸還是另有隱情霜幼,我是刑警寧澤,帶...
    沈念sama閱讀 36,181評論 5 350
  • 正文 年R本政府宣布誉尖,位于F島的核電站罪既,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏铡恕。R本人自食惡果不足惜琢感,卻給世界環(huán)境...
    茶點故事閱讀 41,862評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望探熔。 院中可真熱鬧驹针,春花似錦、人聲如沸诀艰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽其垄。三九已至苛蒲,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間绿满,已是汗流浹背臂外。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留喇颁,地道東北人漏健。 一個月前我還...
    沈念sama閱讀 48,897評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像橘霎,于是被迫代替她去往敵國和親蔫浆。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,500評論 2 359

推薦閱讀更多精彩內(nèi)容