2013-08-20 64 views
0

錯誤時:Java序列:「ClassNotFoundException的」反序列化對象

java.lang.ClassNotFoundException: testprocedure.tp$3 at java.net.URLClassLoader$1.run(Unknown Source) at java.net.URLClassLoader$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Unknown Source) at java.io.ObjectInputStream.resolveClass(Unknown Source) at java.io.ObjectInputStream.readNonProxyDesc(Unknown Source) at java.io.ObjectInputStream.readClassDesc(Unknown Source) at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source) at java.io.ObjectInputStream.readObject0(Unknown Source) at java.io.ObjectInputStream.defaultReadFields(Unknown Source) at java.io.ObjectInputStream.readSerialData(Unknown Source) at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source) at java.io.ObjectInputStream.readObject0(Unknown Source) at java.io.ObjectInputStream.readObject(Unknown Source) at core.ProcedureSetup.load(ProcedureSetup.java:57) at core.Engine.main(Engine.java:25)

我實例化對象,並調用「ProcedureSetup」的‘保存’從類‘TP’的方法。

ProcedureSetup ps=new ProcedureSetup(new Procedure(){ public void doStuff(){ System.out.println("Stuff is being done"); }}); 
ps.save(); 

但我從不同的收集程序,它具有-ALL-所需的代碼,但 「TP」

ProcedureSetup ps=new ProcedureSetup(); 
ps.load(); 

對象保存和加載類內加載:

public void load(){ 
    String path=Operator.persistentGetFile();//gets the file path 
    ObjectInputStream ois=null; 
    FileInputStream fin=null; 
    ProcedureSetup temp=null; 
    try { 
     fin = new FileInputStream(path); 
     ois = new ObjectInputStream(fin); 
     temp=(ProcedureSetup) ois.readObject(); 
     ois.close(); 
     fin.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } catch (ClassNotFoundException e) { 
     e.printStackTrace(); 
    } 

    if(ois!=null){ 
     try { 
      ois.close(); 
     } catch (IOException e) {} 
    } 
    if(fin!=null){ 
     try { 
      fin.close(); 
     } catch (IOException e) {} 
    } 
    if(temp!=null){ 
     a=temp.a; 
    }else{ 
     load();//If a load is failed, restart process. 
    } 
} 

public void save(){ 
    String path=Operator.persistentGetDirectory();//get directory to save to 
     String input = JOptionPane.showInputDialog(this, "Enter the File name:"); 
     ObjectOutputStream oos=null; 
     FileOutputStream fon=null; 
     try { 
      fon = new FileOutputStream(path+input+".obj"); 
      oos = new ObjectOutputStream(fon); 
      try { 
       oos.writeObject(this); 
      } catch (CloneNotSupportedException e) { 
       e.printStackTrace(); 
      } 
      oos.close(); 
      fon.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
      if(oos!=null){ 
     try { 
      oos.close(); 
     } catch (IOException e) {} 
    } 
    if(fon!=null){ 
     try { 
      fon.close(); 
     } catch (IOException e) {} 
    } 

} 

我的問題是:

這些錯誤爲什麼會發生?

爲什麼(如果需要)我需要在我的類路徑中使用「tp」嗎?

如果實際上有一種方法可以將對象保存爲當前狀態,而不需要類路徑中的「tp」,那麼我該如何去做呢? (鏈接將是可愛)

回答

1
new Procedure(){ public void doStuff(){ System.out.println("Stuff is being done"); }} 

以上是匿名內部類的tp類。因此,要被反序列化,這個匿名內部類及其封裝類tp必須存在於類路徑中:字節流包含類的名稱和對象的字段,但它不包含字節 - 類本身的代碼。

你應該讓它成爲一個頂級的類,或者至少是一個內部類static

您還應該尊重Java命名約定:類是CamelCased。

0

Why are these errors happening?

只有一個錯誤的位置:java.lang.ClassNotFoundException: testprocedure.tp$3。這意味着你沒有將testprocedure/tp$3.class部署到對端。

Why (if necessary) do I need to have "tp" in my classpath?

因此,反序列化可以成功。對於沒有.class文件的類,您無法做任何事情,更不用說反序列化它的實例了。

2

當您讀入一個序列化對象時,Java通過使用序列化流中的信息構建該對象的實時副本來「重組」它。除非它具有對象類的.class文件,否則不能執行此操作;它需要一個空白副本來「填寫」來自流中的信息。

最好的選擇通常是確保類在類路徑上。如果你有一些特定的原因,爲什麼這不起作用,Java序列化不適合你; JSON可能是一個合適的選擇。