【问题标题】:Java SerialIzation: 'ClassNotFoundException' when deserializing an ObjectJava SerialIzation:反序列化对象时出现“ClassNotFoundException”
【发布时间】:2013-08-20 09:49:38
【问题描述】:

错误:

java.lang.ClassNotFoundException: testprocedure.tp$3 在 java.net.URLClassLoader$1.run(未知来源) 在 java.net.URLClassLoader$1.run(未知来源) 在 java.security.AccessController.doPrivileged(本机方法) 在 java.net.URLClassLoader.findClass(未知来源) 在 java.lang.ClassLoader.loadClass(未知来源) 在 sun.misc.Launcher$AppClassLoader.loadClass(未知来源) 在 java.lang.ClassLoader.loadClass(未知来源) 在 java.lang.Class.forName0(本机方法) 在 java.lang.Class.forName(未知来源) 在 java.io.ObjectInputStream.resolveClass(未知来源) 在 java.io.ObjectInputStream.readNonProxyDesc(未知来源) 在 java.io.ObjectInputStream.readClassDesc(未知来源) 在 java.io.ObjectInputStream.readOrdinaryObject(未知来源) 在 java.io.ObjectInputStream.readObject0(未知来源) 在 java.io.ObjectInputStream.defaultReadFields(未知来源) 在 java.io.ObjectInputStream.readSerialData(未知来源) 在 java.io.ObjectInputStream.readOrdinaryObject(未知来源) 在 java.io.ObjectInputStream.readObject0(未知来源) 在 java.io.ObjectInputStream.readObject(未知来源) 在 core.ProcedureSetup.load(ProcedureSetup.java:57) 在 core.Engine.main(Engine.java: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 oop serialization deserialization


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:
      new Procedure(){ public void doStuff(){ System.out.println("Stuff is being done"); }}
      

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

      你应该让它成为一个顶级类,或者至少是一个静态内部类。

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

      【讨论】:

        【解决方案3】:

        为什么会发生这些错误?

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-03-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多