Serializable 自定義序列化

2021-07-03 16:35:54 字數 1409 閱讀 9509

序列化物件可以自定義序列化,也可以使用預設序列化

如何選擇呢?

這就要從序列化的目的說起,序列化的目的簡單來說就是儲存,之後可以還原,這就是說只要我們能達到這個目的,都是ok的。如果都ok那麼就可以選擇更ok的形式。

看下面這個例子:

oddnum 這是乙個極其沒有道理的例子,只是為了說明問題

public

class

oddnum

implements

serializable

}private

void

writeobject(objectoutputstream out) throws ioexception

private

void

readobject(objectinputstream in) throws ioexception, classnotfoundexception

}public integer getis()

}

使用預設序列化是ok的。

因為integer的值僅僅與length有關,只要拿到length我們就可以還原原始的物件,所以選擇僅僅序列化length也是可以達到目的,所以選擇自定義序列化也是ok的。

現在就再這兩種方式中哪一種比較好呢,你會選擇將整個陣列序列化,還是僅僅序列化乙個int值,很顯然選擇自定義序列化只序列化length是更好的選擇。

測試程式

@test

public

void

testout00() throws filenotfoundexception, ioexception

@test

public

void

testin00() throws filenotfoundexception, ioexception, classnotfoundexception

}

解釋一下readobject:

private

void

readobject(objectinputstream in) throws ioexception, classnotfoundexception

}

反序列化其實是重新構造了乙個新的例項,可以將反序列化看做是乙個以流為引數的建構函式。

這裡的is就是反序列化時,生成的新的物件的成員。由於is被transient 修飾,in.defaultreadobject()執行完以後,它的值是null,所以這裡需要is = new integer[capacity]初始化一下,然後通過拿到的length賦值。這樣就還原了序列化之前的物件。

從過去幾個測試程式可以看出,序列化無論怎麼實現,用法是完全一樣的,之後就不再寫測試程式了。

自定義 如何自定義協議

何為自定義協議,其實是相對標準協議來說的,這裡主要針對的是應用層協議 常見的標準的應用層協議如http ftp smtp等,如果我們在網路通訊的過程中不去使用這些標準協議,那就需要自定義協議,比如我們常用的rpc框架 dubbo,thrift 分布式快取 redis,memcached 等都是自定義...

自定義控制項 自定義鐘錶

private context mcontext 畫筆 private paint mpaint 控制項的寬 private int mwidth x方向的圓心座標 private int center 鐘錶的半徑 private int mradio 圓環的寬 private int stroke...

自定義控制項及自定義屬性

自定義控制項在android開發中的重要性,是不言而喻,眾人皆知的。希望通過這二天的學習,能讓大家了解自定義控制項的原理,熟悉自定義控制項的使用步驟,並能寫出一些普通的效果。內容介紹 1 使用系統控制項,實現自定義的效果,案例有 優酷環形選單 廣告條 viewpager 下拉列表 spinner 2...