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

标签 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();
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 类位于包名称包中。

消息已在客户端成功发送。在服务器端出现以下错误,

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)

帮我解决这个问题。谢谢!

最佳答案

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

关于java - 通过序列化和反序列化在 mqtt 中发送和接收对象会导致 classnotfound 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22087938/

相关文章:

java - 如何从 Java 访问包含在 scala 包对象中的对象 Foo?

java - 谷歌分析 403 : Forbidden with p12 key in Java

java - JMS 序列化/反序列化机制

DjangoRestFramework - 将 "required = false"添加到 ModelSerializer 字段的正确方法?

javascript - C# JSON 反序列化为复杂类

c# - 使用 json 序列化(反)序列化多个对象时出现 Null 问题

java - 拖动鼠标时图像未绘制

java - Swagger-Codegen 不使用供应商扩展 x-discriminator-value

.net - JavaScriptSerializer 的 XmlAttribute/XmlElement 等价物

SharePoint Webpart 反序列化错误