序列化常見問題

舉例說明序列化常見問題

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章