初識Java序列化和反序列化

2021-08-21 04:31:16 字數 1953 閱讀 7598

要實現序列化代價是非常低的,低到什麼程度呢?任何類只需要實現serializable這個介面就是了,並且這個介面還是乙個空介面,沒有定義任何方法。但真的就這麼簡單嗎?

定義乙個 user 類,包含兩個字段:乙個 string 型別的 name,乙個 int 型別的 age 。

user user = new user("zhangsan", 10);

system.out.println("序列化之前:" + user.tostring());

objectoutputstream out = new objectoutputstream(new fileoutputstream("user.obj"));

out.writeobject(user);

out.close();

objectinputstream in = new objectinputstream(new fileinputstream("user.obj"));

user u = (user) in.readobject();

in.close();

system.out.println("反序列化:" + u.tostring());

執行結果如圖。

我們就這樣完成了乙個簡單的序列化和反序列化的過程,是不是覺得超級簡單呢?

但現在使用者都比較注重隱私,不想讓別人知道年齡,不想序列化 age 字段,那應該怎麼辦呢?關鍵字transient出場了,使用關鍵字transient修飾不想序列化的字段就可以了,這裡是修飾 age 。執行結果如圖。

是不是覺得這樣就完?no!!!這只是乙個開始。既然我們可以指定了某些欄位的是否序列化,那麼我們是不是同樣自定義序列化規則呢?

但是應該怎麼自定義序列化規則呢?serializable介面是沒有任何方法。那麼我們就看這個介面說明吧,如圖。

通俗講,我們想要自定義序列化規則,就是實現指定的方法。

private

void

writeobject(objectoutputstream stream) throws ioexception, classnotfoundexception

private

void

readobject(objectinputstream stream) throws ioexception, classnotfoundexception

執行結果如圖。

可以達到和剛才一樣的效果。

當然序列化還有乙個最重要的東西。

private

static

final

long serialversionuid = 1024l;

這個最好自己宣告,數字大小在合理範圍內即可,如果不手動宣告,這個會在序列化的時候隨機生成,如果序列化和反序列胡的這個 id 不一致,會導致反序列化失敗。驗證方式也很簡單,先序列化,然後修改 id ,接著反序列化。

序列化和反序列化還有很多的坑要踩,作者水平有限,就不展開講解了。

java 序列化 反序列化

序列化 bytearrayoutputstream bytearrayoutputstream new bytearrayoutputstream objectoutputstream objectoutputstream null try catch exception e finally byt...

序列化和反序列化 C 序列化與反序列化。

序列化介紹 把物件用一種新的格式來表示。系列化只序列化資料。序列化不建議使用自動屬性 為什麼要序列化 將乙個複雜的物件轉換流,方便儲存與資訊交換。class program class person public int age 二進位制序列化 就是將物件變成流的過程,把物件變成byte class...

序列化和反序列化

先定義乙個類 serializable xmlroot shintech public class person set public string name set public person this 0,string.empty public person int m age,string m...