一、問題的發現與解決
(1) 在熱部署下,使用dubbo的序列化一個pojo對象,反序列化時報錯:ClassNotFoundException。
最后發現原因是我們的框架選擇使用了java序列化,反序列化時底層會加載和尋找pojo類,在ObjectInputStream調用了如下函數:
protected Class<?> resolveClass(ObjectStreamClass desc) throws IOException, ClassNotFoundException { String name = desc.getName(); try { return Class.forName(name, false, latestUserDefinedLoader()); } catch (ClassNotFoundException ex) { Class<?> cl = primClasses.get(name); if (cl != null) { return cl; } else { throw ex; } } }
(2)latestUserDefinedLoader()默認使用了tomcat的webapploader。而在熱部署環境下,loader是其它的,所以加載不到。
(3)解決辦法是選擇其它序列化方式。當然也可以繼承ObjectInputStream,重寫resolveClass,不過重寫就顯得麻煩了。
dubbo支持的序列化有dubbo、hessian2、java、compactedjava、json、fastjson、nativejava。其中java和nativejava序列化在熱部署環境下有問題。
從效率和壓縮比角度來看:建議使用默認的hessian2,也可以自定義為dubbo和compactedjava等方式。
二、dubbo序列化框架的時序圖
解決問題時整理的時序圖:
三、自定義序列化
如果對dubbo的序列化不滿意,想使用kyro等針對java做了專門優化的序列化。
也可以按照如下設計草稿進行設計:
然后需要加上相關配置。