首页 > 解决方案 > 即使设置为正确的serialVersionUID,JMS activemq 序列化错误本地类也不兼容

问题描述

我不是经验丰富的 Java 开发人员。我正在尝试使用 JMS 向 ActiveMQ 发送对象消息。该消息无法在 AMQ 中处理,但本地类串行版本与流 classdesc 不匹配。serialVersionUID我已经在我的序列化类中明确定义了。不知道是什么问题。请指导我。

Exception: javax.jms.JMSException: Failed to build body from bytes. Reason: java.io.InvalidClassException: com.mypkg.PaymentMessage; local class incompatible: stream classdesc serialVersionUID = 10020120822, local class serialVersionUID = 8437680918200181

PaymentMessage.java:

public class PaymentMessage implements Serializable {
    private static final long serialVersionUID=10020120822L;
    private String mymsg;
    
    public String getPaymentMessage()
    {
        return mymsg;
    }

    public void setPaymentMessage(String mymsg)
    {
        this.mymsg=mymsg;
    }
}

jmsSend.java:

public class jmsSend {
    public static void main(String args[]) {
        String strmsg = "Sample message";
        try {
            ConnectionFactory cf = new ActiveMQConnectionFactory("tcp://XXXX");
            Connection connection = cf.createConnection();
            connection.start();
            Session session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
            Queue queue = session.createQueue("myqueue");
            MessageProducer producer = session.createProducer(queue);
            PaymentMessage msg = new PaymentMessage();
            msg.setPaymentMessage(strmsg);
            ObjectMessage objmsg = session.createObjectMessage(msg);
            producer.send(objmsg);
            session.close();
        } finally {
            if (connection!=null) {
                connection.close();
            }
        }
    }
}

编辑 - 上述错误来自验证/处理消息的消费者。该应用程序有自己的 java 客户端来生成将来不支持的测试消息。所以尝试手动创建和发送消息。服务器端 jar 与我的本地 jar 不匹配,但我尝试将包命名为相同并从原始客户端复制 serialVersionUID。

标签: javaserializationjmsactivemq

解决方案


此错误消息来自 Java 对象序列化处理。该消息表明消费应用程序使用的类版本与生产者使用的版本不同。

如果 Java 检测到对象的序列化字节的 serialVersionUID 值与当前类路径中命名类的 serialVersionUID 值存在差异,它将引发错误。

潜在原因:

  • 消费者类路径中的 jar 重复,并且该类的不良版本首先被解析。
  • 消费者类路径中旧版本的 jar
  • 本地 Maven 存储库中旧版本的 jar(然后是类路径)
  • 远程 Maven 存储库中旧版本的 jar(然后是类路径)

推荐阅读