序列化與反序列化

場景:項目中,將對象序列化,base64編碼,存入到redis緩存中。使用時在反序列化取出來。
問題:對象增加新的基本類型屬性long類型。對于使用沒有該屬性的對象序列化的結果能否被反序列化初始這個屬性。

基本類型

1、序列初始化時,將手機發送時間sendTime相關屬性以及下文測試方法的步驟2注釋掉。
2、運行測試樣例,生成sms.txt文件。
3、取消注釋,將測試方法的步驟1注釋掉。
4、運行測試樣例,看控制臺打印信息。

package study.java.Serializable;

import java.io.Serializable;

public class MessageValue implements Serializable {

    private static final long serialVersionUID = -4387708091987654321L;
    // 手機短信驗證碼
    private String code;

    // 手機短信發送時間
    private long sendTime;

    //驗證次數
    private int validateCount;

    public MessageValue(){

    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public long getSendTime() {
        return sendTime;
    }

    public void setSendTime(long sendTime) {
        this.sendTime = sendTime;
    }


    public int getValidateCount() {
        return validateCount;
    }

    public void setValidateCount(int validateCount) {
        this.validateCount = validateCount;
    }

}

package study.java.Serializable;

import java.io.*;

public class SerializableTest  {
    public static void main(String[] args) throws Exception {
       //步驟1
        serializeMessageValue();
        //步驟2
        MessageValue messageValue = deserializeMessageValue();
        StringBuilder sb = new StringBuilder();
        System.out.println(messageValue.getLastSendTime());

    }

    /**
     * 序列化
     */
    private static void serializeMessageValue() throws IOException {
        MessageValue messageValue=new MessageValue();
        messageValue.setCode("123456");
        messageValue.setValidateCount(1);
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(new File("d:/sms.txt")));
        oos.writeObject(messageValue);
        System.out.println("對象序列化成功!");
        oos.close();
    }

    /**
     * 反序列化
     */
    private static MessageValue deserializeMessageValue() throws Exception {
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(new File("d:/sms.txt")));
        MessageValue mess = (MessageValue) ois.readObject();
        System.out.println("對象反序列化成功!");
        return mess;
    }
}

結論

打印初始對象long為0。證明可以得到該屬性,并且該屬性被初始為0,不會產生異常。

注:自己設置一個 serialVersionUID,否則jvm自動分配,報非法異常。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 一、 序列化和反序列化概念 Serialization(序列化)是一種將對象以一連串的字節描述的過程;反序列化de...
    步積閱讀 1,457評論 0 10
  • 引言 將 Java 對象序列化為二進制文件的 Java 序列化技術是 Java 系列技術中一個較為重要的技術點,在...
    xdoyf閱讀 542評論 0 0
  • 公眾號:追風棧Binary 我們通過文本或者數據庫的方式來永久化存儲程序中產生的數據。這種思路也可以借鑒到保存Ja...
    windytouch閱讀 495評論 0 1
  • 在Java中,我們可以通過多種方式來創建對象,并且只要對象沒有被回收我們都可以復用該對象。但是,我們創建出來的這些...
    懶癌正患者閱讀 1,544評論 0 12
  • .rx的實現原理關聯類型。主要實現ReactiveCompatible協議,實現了這個協議的都會有rx。萬物皆rx
    憶痕無殤閱讀 852評論 0 1