簡體   English   中英

Java SerialIzation:反序列化對象時出現“ ClassNotFoundException”

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM