2014-09-06 34 views
0

我將一個ArrayList<MyClass>作爲對象保存爲ObjectOutputStream。現在,我如何在ObjectInputStream的另一個應用程序項目上讀取該對象?我試過了,它會拋出一個ClassNotFoundException。我已將項目1中的MyClass複製到項目2中。我還必須執行其他任何操作嗎?從不同的應用程序中讀取Java ObjectInputStream

+0

爲什麼你用'FileInputStream'而不是'ObjectInputStream'來讀?你是否檢查過兩個類都具有相同的'serialVersionUID'?如果這沒有幫助,你能否請過去的例外和最近的代碼? – msrd0 2014-09-06 20:50:04

+1

你是什麼意思的「複製」。你不應該複製它。你應該使用完全相同的類。 – 2014-09-06 20:50:32

+0

我的壞我在另一個項目中使用ObjectInputStream ..我將編輯問題 – 2014-09-06 20:51:04

回答

1

您不應該複製一個類,並期望它看起來相同 - Java編譯器/ JVM注意到這些更改。使用完全相同的類文件 !!!

有好幾個版本可以這樣做:

  • 交付PROJECT1與Project2中並設置CLASSPATH
  • 複製在類文件相同的封裝到Project2的
  • 連接廣口瓶中,Project2的含MyClass

而你永遠不應該忘記的東西:每個Serializable應該有一個serialVersionUID Eclipse自動發出警告 - 點擊它並生成它。如果您沒有Eclipse,請使用JDK中的serialver
但是不要忘記:如果您的課程改變了,以至於舊版本不能被新版本解釋,請更改serialversionUID

+0

*每個Serializable應該有一個serialVersionUID *:否。這是不正確的。如果您不知道它是什麼,如何使用它,以及如何對您的類進行更改並向後兼容序列化版本,那麼添加serialVersionUID只會增加代碼的噪音。 – 2014-09-06 21:01:13

+0

@JBNizet這是不正確的。我在與Linux和Windows上運行的'Object [Input | Stream]流擁有相同的JAR文件,並且在另一個操作系統上創建的文件沒有運行異常,那些'serialVersionUID'沒有運行' t匹配 – msrd0 2014-09-06 21:03:11

+0

然後你可能有2個版本的同一個類,但是由兩個不同的編譯器編譯。請參閱http://docs.oracle.com/javase/7/docs/platform/serialization/spec/class.html#4100 – 2014-09-06 21:09:33

相關問題