場景:項目中,將對象序列化,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自動分配,報非法異常。