Java 通过序列化和反序列化在mqtt中发送和接收对象会导致classnotfound异常

Java 通过序列化和反序列化在mqtt中发送和接收对象会导致classnotfound异常,java,serialization,deserialization,classnotfoundexception,mqtt,Java,Serialization,Deserialization,Classnotfoundexception,Mqtt,我正在使用mqtt在客户端和服务器之间发送和接收消息。消息以字节的形式发送。我需要在mqtt消息中发送一个类对象 我尝试将对象序列化为字节,如下所示 deviceloc d=new deviceloc(); d.id=mqttClientId; d.add=strAddress; d.lat=loc.getLatitude(); d.lon=loc.getLongitude(); ByteArrayOutputStream b = new ByteArrayOutputStream(); Obj

我正在使用mqtt在客户端和服务器之间发送和接收消息。消息以字节的形式发送。我需要在mqtt消息中发送一个类对象

我尝试将对象序列化为字节,如下所示

deviceloc d=new deviceloc();
d.id=mqttClientId;
d.add=strAddress;
d.lat=loc.getLatitude();
d.lon=loc.getLongitude();
ByteArrayOutputStream b = new ByteArrayOutputStream();
ObjectOutputStream o=new ObjectOutputStream(b);
o.writeObject(d);
o.close();
byte bytes[]=b.toByteArray();
这里deviceloc是package
com.example.cv\u client\u android中的一个类

我发送的信息如下

mqttClient.publish("admin/location",bytes,MQTT_QUALITY_OF_SERVICE,MQTT_RETAINED_PUBLISH);
在服务器端,我接收消息并按如下方式反序列化

public void publishArrived(String topic, byte[] payloadbytes, int qos, boolean retained)
        throws Exception {
ByteArrayInputStream b1 = new ByteArrayInputStream(payloadbytes);
        ObjectInputStream o1 = new ObjectInputStream(b1);
        deviceloc obj1=(deviceloc)o1.readObject();
        System.out.println(obj1.id);
        System.out.println(obj1.add);
        System.out.println(obj1.lat);
        System.out.println(obj1.lon);
}
这里,类deviceloc位于包名包中

消息已在客户端成功发送。无法在服务器端获取以下错误

java.lang.ClassNotFoundException: com.example.cv_client_android.deviceloc
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1713)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1558)
    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)
    at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
    at java.io.ObjectInputStream.readObject0(Unknown Source)
    at java.io.ObjectInputStream.readObject(Unknown Source)
    at pack.Controller.publishArrived(Controller.java:450)
    at com.ibm.mqtt.MqttClient.publishArrived(Unknown Source)
    at com.ibm.mqtt.MqttBaseClient.process(Unknown Source)
    at com.ibm.mqtt.MqttPublish.process(Unknown Source)
    at com.ibm.mqtt.Mqtt.process(Unknown Source)
    at com.ibm.mqtt.MqttBaseClient.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

帮我做这个。谢谢

反序列化对象的类必须在接收方的类路径上可用。

反序列化对象的类是com.example.cv\u client\u android.deviceloc还是pack.deviceloc?第一个在客户端可用,第二个在服务器端可用。如何在服务器端引入客户端类。请提供解决方案。谢谢我可以为此使用谷歌JSON吗。利与弊是什么。请帮助我,谢谢。缺少的类是异常中命名的类。听起来好像你有两个包中的同一个类。你不能这样做,至少在期望它们可以互换的时候不能这样做。它们不是。@EJP-这两个包都在不同的机器上。我不知道这意味着什么,但是如果你序列化a.b.c.D,你必须在目标上有可用的类。不同包中具有相同名称的另一个类将不起作用。