我有两个不同的包“mas.back.task.Checker”和“mas.front.task.Checker”,其中“Checker”是类,我实现了使用字节缓冲区的序列化将类从客户端套接字发送到服务器套接字的过程,已序列化,但是当从“mas.front.task.Checker”转换为“mas.back.task.Checker”时,它不起作用,并且错误消息在这里:

Exception in thread "pool-1-thread-2" java.lang.ClassCastException: mas.front.task.Checker cannot be cast to mas.back.task.Checker

通过客户端套接字将类发送到服务器套接字的代码在这里:
public static final Object convertByteToObject(byte[] bytes) {
    ObjectInput in;
    try {
        ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
        in = new ObjectInputStream(bis);
        return in.readObject();
    } catch (IOException | ClassNotFoundException ex) {
        Logger.getLogger(Converter.class.getName()).log(Level.SEVERE, null, ex);
        return null;
    }
}

public static final byte[] convertObjectToByte(Object object) {
    try {
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        ObjectOutput out = new ObjectOutputStream(bos);
        out.writeObject(object);
        return bos.toByteArray();
    } catch (IOException ex) {
        Logger.getLogger(Converter.class.getName()).log(Level.SEVERE, null, ex);
        return null;
    }
}

我确认Checker类中的所有字段都相同,我也尝试过“Checker checker = new Checker()”,但是当“checker =(Checker)对象”时,错误显示为上述消息,因此如何解决此问题问题?

评论:
public class Checker implements Serializable {
    public String JobID;
    public String JobUserID;
    public int JobInterval;
    public String JobStatus;
}

最佳答案

如果两个Checker类属于不同的程序包,则它们是不同的。您不必确保就字段或类中定义的方法而言,它们是相同的-它们具有不同的包层次结构,因此并不相同。 您可以轻松重现此问题,而无需序列化或反序列化实例。 只需尝试从一个包中声明Checker类型的变量,然后将其转换为另一个即可。

为什么不将Checker提取到包层次结构中较高层次的,可以在front.taskback.task中较低的位置导入的通用软件包中呢?

关于java - 无法从不同的包源强制转换java对象,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38113966/

10-12 01:39