【发布时间】: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