1

我正在使用mqtt在客户端和服务器之间发送和接收消息。消息以字节的形式发送。我需要在mqtt消息中发送一个类对象。通过序列化和反序列化在mqtt中发送和接收对象导致classnotfound异常

我试图序列化对象转换为字节如下

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是在包中的类com.example.cv_client_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是在包名称包。

消息在客户端成功发送。 T在服务器端发生以下错误,

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) 

帮我看看这个。谢谢!

回答

0

反序列化对象的类必须在接收器的CLASSPATH上可用。

+0

反序列化对象的类是com.example.cv_client_android.deviceloc或pack.deviceloc?第一个在客户端可用,后者在服务器端。我怎样才能把服务器端的客户端类。请提供解决方案。谢谢! – Reva

+0

我可以为此使用Google JSON吗?优缺点都有什么。请帮助我,谢谢 – Reva

+0

缺少的类是在异常中命名的类。听起来就像你有两个包装里的同一个班级。你不能那样做,至少在期望它们可以互换的时候不行。他们不是。 – EJP