readObject()之后的代码不会运行

时间:2015-06-12 09:14:07

标签: java ibm-mq

我正在开发一个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();

            }

此处是序列化后对象的字节数组。 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的位置,这些是值。谁能告诉我对象是否正确?

is object

2 个答案:

答案 0 :(得分:0)

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

您的实际症状不可信。必须抛出异常,否则您的阻塞时间早于声明。

答案 1 :(得分:0)

ObjectInputStream的readObject是一种阻塞方法。首先使用pack方法进行检查,如果有什么内容可以不受阻塞地阅读。

在这种情况下,

可能最有可能返回0。

这可能只是您正在寻找的解决方案的一半,但我想如果您有任何要阅读的内容,我会告诉您。