0

错误:

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) 在 java.io.ObjectInputStream.readOrdinaryObject(Unknown Source) 在 java.io。java.io.ObjectInputStream.readSerialData(Unknown Source) at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source) at java.io.ObjectInputStream.java.io.ObjectInputStream.defaultReadFields(Unknown Source) 的 ObjectInputStream.readObject0(Unknown Source)。 readObject0(Unknown Source) at java.io.ObjectInputStream.readObject(Unknown Source) at core.ProcedureSetup.load(ProcedureSetup.java:57) at core.Engine.main(Engine.java:25)核心.Engine.main(Engine.java:25) 处的 ProcedureSetup.load(ProcedureSetup.java:57)核心.Engine.main(Engine.java:25) 处的 ProcedureSetup.load(ProcedureSetup.java:57)

我实例化对象并从“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”,我将如何去做呢?(链接会很可爱)

4

3 回答 3

2

当您读入序列化对象时,Java 通过使用序列化流中的信息来“重构”它,以构建对象的实时副本。.class除非它有对象类的文件,否则它不能这样做;它需要一个空白副本来“填写”来自流的信息。

最好的选择通常是确保类在类路径上。如果您有某些特殊原因导致这不起作用,那么 Java 序列化不适合您;JSON 可能是一个合适的选择。

于 2013-08-20T09:53:40.367 回答
1
new Procedure(){ public void doStuff(){ System.out.println("Stuff is being done"); }}

以上是您班级的匿名内部tp班级。因此,要反序列化,这个匿名内部类及其封闭类tp必须存在于类路径中:字节流包含类的名称和对象的字段,但不包含字节码类本身的。

您应该使其成为顶级类,或者至少是静态内部类。

您还应该尊重 Java 命名约定:类是 CamelCased。

于 2013-08-20T09:53:54.393 回答
0

为什么会发生这些错误?

这里只有一个错误:java.lang.ClassNotFoundException: testprocedure.tp$3. 这意味着您尚未部署testprocedure/tp$3.class到对等方。

为什么(如有必要)我的类路径中需要有“tp”?

这样反序列化才能成功。您不能对没有 .class 文件的类做任何事情,更不用说反序列化它的实例了。

于 2013-08-20T09:53:12.947 回答