【问题标题】:Deserialize an Object in the JMS message反序列化 JMS 消息中的对象
【发布时间】:2012-09-13 23:49:28
【问题描述】:

有没有人尝试过从 IBM MQ Visual Edit 反序列化 JMS 对象消息?我需要破译通过 MQ 作为 JMS 消息发送的对象。我将消息保存到一个文件并尝试使用 ObjectInputStream 读取它,如下所示:

ObjectInputStream objectStream = new ObjectInputStream(new DataInputStream(new FileInputStream("PATH TO THE FILE")));
SomeObject result = ((SomeObject)objectStream.readObject());

但我得到一个错误:

java.io.StreamCorruptedException: invalid stream header: 52464820
    at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:794)
    at java.io.ObjectInputStream.<init>(ObjectInputStream.java:291)
    at com.railinc.emis.transaction.model.DeserializerClass.main(DeserializerClass.java:14)

我对此进行了一些研究,发现用于序列化的相同类应该用于反序列化。

如果有人以前尝试过,请告诉我你的经验。

【问题讨论】:

  • 看来“无效的流标头”有几个可能的原因。是的,您需要验证您获得的类与生成 Object 消息内容的类具有相同的serialVersionUID
  • 你能告诉我们你用来序列化的代码吗?
  • 我相信是一样的。但我只是想知道将对象放入队列时如何序列化(可能是 IBM websphere 内部的东西,我没有任何源代码)。
  • @Plinio 正如我所提到的,我无权访问序列化代码,因为当我使用以下代码向 MQ 发送消息时会这样做 Context context = new InitialContext(); // 查找队列 Queue queue = (Queue)PortableRemoteObject.narrow(context.lookup(jndiQueueName), Queue.class); // 创建发送者 sender = session.createSender(queue); // 创建短信 ObjectMessage textMessage = session.createObjectMessage(message); // 发送短信到队列 sender.send(textMessage);
  • 当消息被发送时,它必须是它被序列化的地方。发送者类实现是一个名为 com.ibm.ejs.jms.JMSWrapQueueSender 的 IBM 类。 (抱歉cmets中的代码格式不好)

标签: java jms websphere ibm-mq mq-visual-edit


【解决方案1】:

我不知道 IBM MQ Visual Edit,但如果它具有保存 ObjectMessage 的功能,那么它可能不仅会保存消息中包含的对象,还会保存标头(包含 JMS 属性)。我认为您不能简单地使用 ObjectInputStream 从文件中读取对象。为什么不将该消息放在测试队列中并从那里读取呢?

【讨论】:

  • @Andreas Veithen 这就是我最终所做的。将生产中的消息重新加载到我的开发环境中并对其进行调试。非常感谢大家的回复。
猜你喜欢
  • 2015-08-03
  • 1970-01-01
  • 1970-01-01
  • 2011-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多