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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

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

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

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

定義

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

反序列:將字節序列恢復為對象的過程。

序列化和反序列的用途:

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

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

3.通過序列化操作將對象數據在網絡上進行傳輸(由于網絡傳輸是以字節流的方式對數據進行傳輸的.因此序列化的目的是將對象數據轉換成字節流的形式);

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

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

序列化方式

Serializable

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

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

相應的實現好了,那么如何寫入和讀取呢?

寫入:

public void writeSerializable() {

try {

// 構造對象

Book book = new Book();

// 構造序列化輸出字節流

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

// 序列化對象

oos.writeObject(book);

// 關閉流 oos.close();

} catch (Exception e) {

e.printStackTrace();

}

}

讀取:

public void readSerializable() {

try {

// 創建序列化讀取字節流

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

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

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

// 關閉流 ois.close();

} catch (Exception e) {

e.printStackTrace();

}

}

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

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

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

serialVersionUID 的工作機制:

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

Parcelable

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

Parcelable實現兩個方法,創建一個字段:

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

實現public void writeToParcel(Parcel dest, int flags):將當前對象寫入到序列化結構中

構造Parcelable.Creator字段,該對象需要實現兩個方法:

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

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

Serializable和Parcelable的比較

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

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

3.Parcelable適合進程間的通信,運行期。Serializable適合文件存儲即網絡傳輸。

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

5.內存間數據傳輸時推薦使用Parcelable,如activity間傳輸數據,而Serializable可將數據持久化方便保存,所以在需要保存或網絡傳輸數據時選擇Serializable

參考

Android IPC 進程間通信

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。