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通信之序列化与反序列化(三)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 白盒测试方法和黑盒测试方法
- 下一篇: shell与其他语言不同点