[英]Java SerialIzation: 'ClassNotFoundException' when deserializing an Object
錯誤:
java.lang.ClassNotFoundException:java.net.URLClassLoader $ 1.run(未知源)的java.net.URLClassLoader $ 1.run(未知源)的testprocedure.tp $ 3 Java上java.security.AccessController.doPrivileged(本機方法) .net.URLClassLoader.findClass(未知源)(java.lang.ClassLoader.loadClass(未知源)(sun.misc.Launcher $ AppClassLoader.loadClass(未知源))(java.lang.ClassLoader.loadClass(未知源)) .lang.Class.forName0(本機方法)(位於java.io.ObjectInputStream.resolveClass(未知源),位於java.io.ObjectInputStream.readNonProxyDesc(未知源),位於java.io.ObjectInputStream.resolveClass(未知源),位於java.io .ObjectInputStream.readClassDesc(未知來源)(java.io.ObjectInputStream.readOrdinaryObject(未知來源)(java.io.ObjectInputStream.readObject0)(java.io.ObjectInputStream.defaultReadFields(未知來源))(java.io.ObjectInputStream處未知) .readSerialData(未知源),位於java.io.ObjectInputStream.readOrdinaryObject(未知源) e)在core.Engine.main(Engine.java :)在java.io.ObjectInputStream.readObject0(Unknown Source)在java.io.ObjectInputStream.readObject(Unknown Source)在core.ProcedureSetup.load(ProcedureSetup.java:57) 25)
我實例化該對象,並從類“ tp”調用“ ProcedureSetup”的“ save”方法。
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”,那么我該怎么做呢? (鏈接會很可愛)
當您讀入序列化對象時,Java通過使用序列化流中的信息來“重構”它,以構建對象的實時副本。 除非它具有對象類的.class
文件,否則它將無法執行此操作。 它需要一個空白副本來“填充”流中的信息。
最好的選擇通常是確保類在類路徑上。 如果您有某些特殊原因無法解決該問題,那么Java序列化不適合您。 JSON可能是一個合適的選項。
new Procedure(){ public void doStuff(){ System.out.println("Stuff is being done"); }}
上面是tp
類的匿名內部類。 因此,要反序列化,該匿名內部類及其封閉類tp
必須存在於類路徑中:字節流包含類的名稱和對象的字段,但不包含字節-類本身的代碼。
您應該使其成為頂級類,或者至少使其成為靜態內部類。
您還應該遵守Java命名約定:類是CamelCased。
為什么會發生這些錯誤?
這里只有一個錯誤: java.lang.ClassNotFoundException: testprocedure.tp$3
。 這意味着您尚未將testprocedure/tp$3.class
部署到對等方。
為什么(如有必要)我的類路徑中需要包含“ tp”?
這樣反序列化就能成功。 對於沒有.class文件的類,您無法做任何事情,更不用說反序列化它的實例了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.