【问题标题】:Code after readObject() does not runreadObject() 之后的代码不运行
【发布时间】:2015-08-28 05:59:07
【问题描述】:

我正在开发一个 UI,它从 zookeeper 读取序列化对象,对其进行反序列化,然后将其转换为 JSON。由于某种原因,我无法反序列化 MQTopic 对象。但我可以对其他对象做同样的事情。

这是将 byte[] 转换为 MQTopic 对象的部分。

if (tester != null && tester.contains("com.ibm.mq.jms.MQTopic")) {
                System.out.println(getValue());
                ByteArrayInputStream in = new ByteArrayInputStream(this.value);
                ObjectInputStream is = new ObjectInputStream(in);
                System.out.println("after deserializing..");
                topic = (MQTopic) is.readObject();
                System.out.println("after typecasting..");
                System.out.println(topic.getTopicName());
                System.out.println(topic.toString());

                is.close();
                in.close();

            }

这里的value是对象序列化后的字节数组。 topic = (MQTopic) is.readObject(); 之后没有任何内容。甚至没有打印语句。程序既不会终止,也不会抛出或捕获异常。

编辑:整个方法

public String getStrValue() {
    FtpConnectionInfo ftp = null;
    MQTopic topic = null;
    try {
        String tester = new String(this.value, "UTF-8");
        if (tester != null && tester.contains("FtpConnectionInfo")) {
            ByteArrayInputStream in = new ByteArrayInputStream(this.value);
            ObjectInputStream is = new ObjectInputStream(in);
            ftp = (FtpConnectionInfo) is.readObject();
            in.close();
            is.close();
            Gson gson = new Gson();
            return gson.toJson(ftp);

        } else if (tester != null
                && tester.contains("com.ibm.mq.jms.MQTopic")) {
            ByteArrayInputStream in = new ByteArrayInputStream(this.value);
            ObjectInputStream is = new ObjectInputStream(in);
            System.out.println("after deserializing..");
            topic = (MQTopic) is.readObject();
            System.out.println("after typecasting..");
            System.out.println(topic.getTopicName());
            System.out.println(topic.toString());
            is.close();
            in.close();

        } else {
            return new String(this.value, "UTF-8");
        }
    } catch (UnsupportedEncodingException ex) {
        System.out.println("unsupported error ");
        ex.printStackTrace();
        //logger.error(Arrays.toString(ex.getStackTrace()));
    } catch (Exception e) {
        System.out.println("Exception in new logic.");
        e.printStackTrace();
    }
    System.out.println("im out of try");

    return null;
}

FTP if 循环可以正常工作,但 Topic 循环不能在类型转换之外工作。

编辑 2:这是其他团队将对象存储到 Zookeeper 中的方式

public static byte[] serialize(Object obj) throws IOException {
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        ObjectOutputStream os = new ObjectOutputStream(out);
        os.writeObject(obj);
        return out.toByteArray();
    }

byte[] 存储在 Zookeeper 中,这就是我在 UI 中检索的内容。

编辑 3: 我对进程进行了调试,在调用 is 时,这些是值。谁能告诉我这个对象是否正确?

【问题讨论】:

  • 您的代码中是否启用了记录器?根据您的评论,对象读取可能存在异常。
  • 那里必须在那条线上抛出异常。 JVM 不只是随机停止执行代码。您是否尝试过使用调试器单步执行代码以查看实际发生的情况?
  • 你的意思是 try catch 吗?我不明白你所说的记录器是什么意思。
  • @Raniz 整个代码都被 try catch 包围,我正在捕捉 Exception 。仍然没有任何反应。
  • 请告诉我们你的捕获块,@ViChU

标签: java ibm-mq


【解决方案1】:

你做错了。您应该先反序列化对象,然后使用instanceof 来查看它是什么类型。在最好的情况下,将二进制数据转换为 String 是不好的做法。

您的实际症状不可信。必须抛出异常,否则您会提前阻塞。

【讨论】:

  • 是的,我知道,这只是一个原型,并不是最终代码。目前,我进入循环没有任何问题。
【解决方案2】:

ObjectInputStream 的 readObject 是一个阻塞方法。首先使用available方法检查是否有内容可以读取而不阻塞。

available 在这种情况下很可能会返回 0。

这可能只是您正在寻找的解决方案的一半,但我认为这会让您知道您是否有任何要阅读的内容。

【讨论】:

  • 我试过 available 并且它为两个对象返回 0 即。 FTP 和主题。但是我的 FTP 仍然没有任何问题。
  • 我明白了。这意味着,字节数组没有可读取的内容。主题反序列化块期间的字节数组长度(this.value)是多少?
  • 如果是这种情况,那么我建议您按照@Dragan Bozanovic 对您的问题的评论进行操作。
  • 我添加了调试信息。你能告诉我你是否能在其中发现任何可疑的东西。
  • 能否在序列化代码中添加os.flush()。我怀疑这会使 InputStream 假设还有更多数据并且它只是等待。
猜你喜欢
  • 2021-01-09
  • 2015-05-18
  • 1970-01-01
  • 2014-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多