舉例說明序列化常見問題
1.例子,將OrderTimeCostDTO的對象序列化,再反序列化
@Test
public void m1() throws IOException, ClassNotFoundException {
OrderTimeCostDTO otc =OrderTimeCostDTO.builder().cutTime(new Date()).build();
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("d:\\stu.txt"));
oos.writeObject(otc);
oos.close();
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("d:\\stu.txt"));
OrderTimeCostDTO o = (OrderTimeCostDTO)ois.readObject();
log.info(o+"");
ois.close();
}
打印結果:
OrderTimeCostDTO(cutTime=Tue Apr 14 15:52:06 CST 2020,...)
2.現在修改OrderTimeCostDTO類,多加一個參數
public class OrderTimeCostDTO implements Serializable{
/**
* 多加一個aa參數
*/
private Date aa;
...
}
3.將d:\stu.txt中的數據反序列化
@Test
public void m1() throws IOException, ClassNotFoundException {
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("d:\\stu.txt"));
OrderTimeCostDTO o = (OrderTimeCostDTO)ois.readObject();
log.info(o+"");
ois.close();
}
結果:
java.io.InvalidClassException: com.baturu.tms.api.dto.transport.OrderTimeCostDTO;
local class incompatible: stream classdesc serialVersionUID = -350958361371879346, local class serialVersionUID = -2789788224825224853
at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:687)
...
解釋
將一個對象序列化時,程序會生成一個serialVersionUID
這個serialVersionUID會因爲各種原因發生變化,例如類的屬性或方法變化,SDK版本的變化等等
所以當我們將類多加一個參數時,serialVersionUID發生了變化,所以將d:\stu.txt文件中的對象對映的serialVersionUID與本地serialVersionUID做比較時
,發現不一致,報錯。
其中model來自反序列化文件時拿到的ObjectStreamClass,osc爲反序列化時得到的類的ObjectStreamClass,ObjectStreamClass可以理解爲類的描述,包括參數等等,
具體可以看下序列化的源碼,推薦:https://blog.csdn.net/u011315960/article/details/89963230