04.11 Python在pickle序列化後數據如何處理

曾經接觸過一個項目,是關於Python用pickle序列化後的數據。大概就是可能需要將之前python寫的一套數據傳輸的代碼,改用Java實現,提高開發效率;python代碼結構很清晰,分為兩部分:

抽取接口數據,pickle序列化後打包上傳到雲服務器;

從雲服務器下載,解析入庫;

我主要做的是先將解析入庫這部分Java化,其中一個很大的問題就是解析pickle序列化後的數據,處理這樣的問題對當時作為新手的我還是費了一番心思。

主要是好像這種問題網上很少解決方案,也不知道是不是我這操作太奇葩了。想我遇到的這樣的問題並不常見,現成的解決方案並不好找,只能藉助梯子了。尚學堂•百戰程序員陳老師指出看過網上的示例都沒有能正常跑的,或多或少都有些問題,不過也讓我瞭解到了目前的解決方案,也主要分為兩種:

藉助Jython來做,引入jar包後,可以在Java裡使用python的代碼,當然這應該是對應的Java實現吧,但是感覺有點重,jar包有30多M。

Python在pickle序列化後數據如何處理

使用pyrolite包,這個包主要是用於與python通信,進行遠程調用python的方法;

因為我們數據打包上傳跟下載解析是分開部署的, 如果在解析那塊還去單獨部署個python用來解析數據,再用Java去遠程調用去獲取返回值,這就有點多此一舉了。所以我們這邊使用的就是通過引入Jython來實現了,到時候數據打包如果也改成Java實現的話,那就再改造了。

解決這個問題花的時間最久,不解決的話使用pystring的時候會報空指針錯誤;之前從網上看到過類似的,需要在使用前先執行.gcMonitorGlobal方法,但是由於個人粗心。跑去調用pystring.gcMonitorGlobal,然而並沒有什麼實際用處,最後仔細看錯誤發現是PyBaseString的問題,而PyString又是繼承PyBaseString的,後來在代碼中加入靜態塊解決該問題。

至此遇到的大問題都已經解決,其他問題的話就比較常見了(比如格式轉換異常這種),主要是也沒有搜到什麼完整的解決方案,也是自己東拼西湊才搞定的,也是不容易,還是因為對python也不太瞭解吧,遇到沒見過的報錯有點懵,而且有時候報的錯也不一定是真實的錯。例如ValueError這個錯,最開始報的是空指針,通過調試代碼看,是Jython裡的異常類toString的時候空指針,導致無法發現真實的錯誤,只能一步步調試。

小編為大家準備好了Python的相關資料,如需要更多的學習資料可以私信小編

Python在pickle序列化後數據如何處理


分享到:


相關文章: