Java 反序列化类在 java.lang.ClassNotFoundException 上失败,包名来自服务器

标签 java serialization

我尝试从服务器反序列化类,但在客户端我得到:

java.lang.ClassNotFoundException: com.server.core.StateFilesStruct

在我的客户端中,具有此包名称的 StateFilesStruct 类的位置:

com.client.core.StateFilesStruct

这是我类的:

public  Object deserialize(byte[] bytes)   {
        ByteArrayInputStream b = new ByteArrayInputStream(bytes);
        ObjectInputStream o = null;
        try {
            o = new ObjectInputStream(b);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        try {
            return o.readObject();
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return o;
}

我发送这个的类在服务器中:

package com.server.core;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Hashtable;

 public class StateFilesStruct implements Serializable {
    private static final long serialVersionUID = 988633010151085730L;
    private Hashtable<String,String> Repository;
    public Hashtable<String, String> getRepository() {
        return Repository;
    }
    public void setRepository(Hashtable<String, String> repository) {
        Repository = repository;
    }
    public StateFilesStruct()
    {
        Repository = new Hashtable<String,String>();
    }
}

我在客户端中保留的类与服务器类相同,但包名称不同:

package com.client.core;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Hashtable;

 public class StateFilesStruct implements Serializable {
    private static final long serialVersionUID = 988633010151085730L;
    private Hashtable<String,String> Repository;
    public Hashtable<String, String> getRepository() {
        return Repository;
    }
    public void setRepository(Hashtable<String, String> repository) {
        Repository = repository;
    }
    public StateFilesStruct()
    {
        Repository = new Hashtable<String,String>();
    }
}

我试图在客户端解析类的方式是: 使用 ZeroMQ 从 tcpip 套接字接收

 byte[] byteFileStruct = m_pNetworkManager.getSocket().recv(0); 
 StateFilesStruct stateFilesStruct = (StateFilesStruct)deserialize(byteFileStruct);

获取此异常,因为您可以从服务器类中看到它:

java.lang.ClassNotFoundException: com.server.core.StateFilesStruct
    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)

最佳答案

在java中,包名是类名的一部分。就 JVM 而言,这是两个完全不同的类,因此您需要在类路径中具有要反序列化的相同类。

关于Java 反序列化类在 java.lang.ClassNotFoundException 上失败,包名来自服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14591038/

相关文章:

java - Hibernate映射问题

python - 字典扩展父类(super class)的完整表示

c# - Mono、带有 MarshalByRefObject 的可序列化对象

java - 着色按钮

java - 在java类的main方法中传递参数

java - 将原始文件(二进制数据)转换为 XML 文件

Java - 使用 nio 读取对象

python - Django休息框架: Password not hashing properly on update

java - 序列化和反序列化未实现 Serializable 的对象

java - 如何对输入使用忽略大小写语句