不能从不同的包源强制转换java对象
我有两个不同的包“mas.back.task.Checker”和“mas.front.task.Checker”,其中“Checker”是类,我用bytebuffer的序列化实现了将类从客户端套接字发送到服务器套接字,我成功地序列化了,但当从“mas.front.task.Checker”转换为“mas.back.task.Checker”时,它不工作,此处显示错误消息:不能从不同的包源强制转换java对象,java,sockets,casting,Java,Sockets,Casting,我有两个不同的包“mas.back.task.Checker”和“mas.front.task.Checker”,其中“Checker”是类,我用bytebuffer的序列化实现了将类从客户端套接字发送到服务器套接字,我成功地序列化了,但当从“mas.front.task.Checker”转换为“mas.back.task.Checker”时,它不工作,此处显示错误消息: Exception in thread "pool-1-thread-2" java.lang.ClassCastExcep
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)object”时,错误显示为上面的消息,那么我如何解决这个问题呢
备注:
public class Checker implements Serializable {
public String JobID;
public String JobUserID;
public int JobInterval;
public String JobStatus;
}
如果两个
Checker
类属于不同的包,则它们是不同的。确保它们在类中定义的字段甚至方法方面是相同的并不重要——它们具有不同的包层次结构,因此并不相同无需序列化或反序列化实例,即可轻松重现此问题。只需尝试从一个包中声明Checker
类型的变量,然后将其强制转换到另一个包中即可
为什么不将
Checker
提取到包层次结构中较高的公共包中,该包可以在front.task
和back.task
的较低位置导入?原因是通过序列化或反序列化通过TCP/IP套接字发送类,对于该类,前端客户端为mas.front.task.XXX,后端为mas.back.task.XXX,您对上述内容有何建议?第二个原因是我不仅需要发送检查程序类型,还需要发送其他类型的。您是否编写了检查程序类?是的,我确定,因为我有前端和后端服务器,它们不是相同的包路径,当然……@AndyChan用另一种方式表达Amir的建议,您应该将Checker
放在一个单独的库项目中,该库项目由前端和后端项目使用。也许你可以称它为mas.common.task.Checker
。