我正在开发一个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的位置,这些是值。谁能告诉我对象是否正确?
答案 0 :(得分:0)
你做错了。您应首先反序列化对象,然后使用instanceof
查看它的类型。在最好的情况下,将二进制数据转换为String
是不好的做法。
您的实际症状不可信。必须抛出异常,否则您的阻塞时间早于声明。
答案 1 :(得分:0)
ObjectInputStream的readObject是一种阻塞方法。首先使用pack方法进行检查,如果有什么内容可以不受阻塞地阅读。
在这种情况下,可能最有可能返回0。
这可能只是您正在寻找的解决方案的一半,但我想如果您有任何要阅读的内容,我会告诉您。