場(chǎng)景:項(xiàng)目中,將對(duì)象序列化,base64編碼,存入到redis緩存中。使用時(shí)在反序列化取出來(lái)。
問題:對(duì)象增加新的基本類型屬性long類型。對(duì)于使用沒有該屬性的對(duì)象序列化的結(jié)果能否被反序列化初始這個(gè)屬性。
基本類型
1、序列初始化時(shí),將手機(jī)發(fā)送時(shí)間sendTime相關(guān)屬性以及下文測(cè)試方法的步驟2注釋掉。
2、運(yùn)行測(cè)試樣例,生成sms.txt文件。
3、取消注釋,將測(cè)試方法的步驟1注釋掉。
4、運(yùn)行測(cè)試樣例,看控制臺(tái)打印信息。
package study.java.Serializable;
import java.io.Serializable;
public class MessageValue implements Serializable {
private static final long serialVersionUID = -4387708091987654321L;
// 手機(jī)短信驗(yàn)證碼
private String code;
// 手機(jī)短信發(fā)送時(shí)間
private long sendTime;
//驗(yàn)證次數(shù)
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("對(duì)象序列化成功!");
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("對(duì)象反序列化成功!");
return mess;
}
}
結(jié)論
打印初始對(duì)象long為0。證明可以得到該屬性,并且該屬性被初始為0,不會(huì)產(chǎn)生異常。
注:自己設(shè)置一個(gè) serialVersionUID,否則jvm自動(dòng)分配,報(bào)非法異常。