日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

c语言 ipc 参数 序列化,浅谈IPC通信之序列化与反序列化(三)

發(fā)布時間:2023/12/10 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c语言 ipc 参数 序列化,浅谈IPC通信之序列化与反序列化(三) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

由于進行通信肯定要涉及數(shù)據(jù)的處理,所以我們需要先了解兩個基礎(chǔ)的概念,序列化和反序列化。

定義

序列化:將對象轉(zhuǎn)化為可保存的字節(jié)序列(注意是對象);

反序列:將字節(jié)序列恢復(fù)為對象的過程。

序列化和反序列的用途:

1.以某種存儲形式使自定義對象序列化并永久的保存對象數(shù)據(jù)(將對象數(shù)據(jù)保存在文件當中,或者是磁盤中);

2.序列化對象的時候只是針對變量進行序列化,不針對方法進行序列化;

3.通過序列化操作將對象數(shù)據(jù)在網(wǎng)絡(luò)上進行傳輸(由于網(wǎng)絡(luò)傳輸是以字節(jié)流的方式對數(shù)據(jù)進行傳輸?shù)?因此序列化的目的是將對象數(shù)據(jù)轉(zhuǎn)換成字節(jié)流的形式);

4.通過序列化在進程間傳遞對象;

5.Java平臺允許我們在內(nèi)存中創(chuàng)建可復(fù)用的Java對象,但一般情況下,只有當JVM處于運行時,這些對象才可能存在,即,這些對象的生命周期不會比JVM的生命周期更長(即每個對象都在JVM中)但在現(xiàn)實應(yīng)用中,就可能要停止JVM運行,但有要保存某些指定的對象,并在將來重新讀取被保存的對象。這是Java對象序列化就能夠?qū)崿F(xiàn)該功能。(可選擇入數(shù)據(jù)庫、或文件的形式保存);

序列化方式

Serializable

Serializable是Java提供的一個序列化接口,他是一個空接口,類實現(xiàn)該接口即可實現(xiàn)序列化。

在實現(xiàn)Serializable時候,編譯器會提示,讓我們添加serialVersionUID字段,該字段是一個關(guān)鍵的字段

相應(yīng)的實現(xiàn)好了,那么如何寫入和讀取呢?

寫入:

public void writeSerializable() {

try {

// 構(gòu)造對象

Book book = new Book();

// 構(gòu)造序列化輸出字節(jié)流

ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("xxx.txt"));

// 序列化對象

oos.writeObject(book);

// 關(guān)閉流 oos.close();

} catch (Exception e) {

e.printStackTrace();

}

}

讀取:

public void readSerializable() {

try {

// 創(chuàng)建序列化讀取字節(jié)流

ObjectInputStream ois = new ObjectInputStream(new FileInputStream( "xxx.txt"));

// 反序列化(讀取)對象

Book book = (Book) ois.readObject();

// 關(guān)閉流 ois.close();

} catch (Exception e) {

e.printStackTrace();

}

}

在序列化時,如果我們序列化對象之后,改變了我們的類結(jié)構(gòu)(添加或改變字段),甚至是修改了字段的類型,修改了類名,那么我們能反序列化成功嗎。那么關(guān)鍵就在于serialVersionUID字段。

如果我們不指定的話。在序列化時,會計算當前類結(jié)構(gòu)的hash值并賦給serialVersionUID,當反序列時,會比對該值是否相同,如果不相同,則無法序列化成功。

我們也可以手動指定,手動指定的好處是在類結(jié)構(gòu)發(fā)生變化時,能夠最大程度的反序列,當然前提是只是刪除或添加了字段,如果是變量類型發(fā)生了變化,則依然無法反序列成功。

serialVersionUID 的工作機制:

序列化時系統(tǒng)會把當前類的serialVersionUID寫入序列化文件中,當反序列化時候系統(tǒng)會去檢測文件中的serialVersionUID,看它是否和當前類的serialVersionUID一致,如果一致說明序列化類的版本和當前類的版本是相同的,這個時候可以成功反序列化,否則就說明當前類和序列化的類相比發(fā)生了某些變化。所以,我們最好指定serialVersionUID,避免他自定生成。

Parcelable

Parcelable是Android中特有的一種序列化方式,在intent傳值時,通常使用該方式。該方式實現(xiàn)序列化,依然實現(xiàn)Parcelable,然后實現(xiàn)一些該接口的方法。

Parcelable實現(xiàn)兩個方法,創(chuàng)建一個字段:

實現(xiàn)describeContents():返回當前對象的內(nèi)容描述。幾乎所有情況下都是返回0。

實現(xiàn)public void writeToParcel(Parcel dest, int flags):將當前對象寫入到序列化結(jié)構(gòu)中

構(gòu)造Parcelable.Creator字段,該對象需要實現(xiàn)兩個方法:

public Book createFromParcel(Parcel source):從序列化后的對象中創(chuàng)建原始的值。

public Book[] newArray(int size):創(chuàng)建指定長度的原始對象數(shù)組。

Serializable和Parcelable的比較

1.Serializable是Java中的序列化接口,其使用起來簡單但是開銷較大,序列化和反序列化需要大量的I/O操作。

2.Parcelable是Android中的序列化方式,更適用于Android的平臺上,他的缺點是使用起來稍微麻煩,但是效率很高。

3.Parcelable適合進程間的通信,運行期。Serializable適合文件存儲即網(wǎng)絡(luò)傳輸。

4.Serializable序列化不保存靜態(tài)變量,可以使用Transient關(guān)鍵字對部分字段不進行序列化,也可以覆蓋writeObject、readObject方法以實現(xiàn)序列化過程自定義

5.內(nèi)存間數(shù)據(jù)傳輸時推薦使用Parcelable,如activity間傳輸數(shù)據(jù),而Serializable可將數(shù)據(jù)持久化方便保存,所以在需要保存或網(wǎng)絡(luò)傳輸數(shù)據(jù)時選擇Serializable

參考

Android IPC 進程間通信

總結(jié)

以上是生活随笔為你收集整理的c语言 ipc 参数 序列化,浅谈IPC通信之序列化与反序列化(三)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。