2014-01-16 136 views
0

最近,我們的項目不得不重新設計。但是當我使用JAVA的Serializable接口時,我花了很多時間。Java可串行化混淆

現在,有兩種方案:A和B.

  1. A是離線的,它的功能是JSON數據轉換爲C類
  2. 然後序列化C和它存儲在Redis的(現在的C是一個對象)
  3. 乙獲取對象,反序列化,並將其轉化到C

,但它不工作。在日誌信息中,我發現,中的C類也在A和B中必須具有相同的目錄。也就是說,當我把C中的C與package dir「com.hello.src.a」放在一起時,在B與包dir「com.world.src.b」,B程序將拋出一個ClassNotFoundException,因爲B的JVM找到C與dir「com.hello.src.a」!

當我把C放在A和B中使用相同的包dir時,它可以工作。我想知道如果有更好的方法來解決這個問題。當我可反序列化時,我在B程序中詳細說明了包目錄以查找類C(例如,我告訴B的JVM用包dir「com.world.src.b」查找C)

+2

我無法理解,您能簡單介紹一些細節。 –

+3

這確實令人困惑;我不知道你在問什麼。 –

+0

爲什麼不直接將JSON存儲在數據庫中而不是將其存儲爲序列化的java對象? – ivarni

回答

1

將類從一個包複製到另一個是完全沒有意義的,並且是這樣的問題的原因。確定您希望課程C要放入哪個包,並將其留在那裏,在原地使用它。

+0

但A和B不在項目中。所以,他們不共享C類。另一方面,A和B是不同的程序。所以他們有不同的包裝目錄。當我把C放在同一個包目錄中時,A或B必須創建無用的包目錄。 – niushuai

+0

我只能重複我上面所說的。你如何組織你的項目是你的事情,但保留課程的原始包裝是*要求。*觀察它。你不能序列化'x.C'類,並期望將其反序列化爲'y.C',其中''''''和'y'是兩個不同的包。它不這樣工作。它是按照它的序列化的,而不是你想要的。對於需要存在的包來說,沒有什麼「無用的」。 – EJP

+0

謝謝。看來安全是最重要的。我會遵守這條規則。 – niushuai