響應我要推任意XMLEncoded的Java有道對象來回使用道場的cometd渠道,我有一個問題,正確解碼的有效載荷。來解碼道場的cometd Java客戶端
爲了做到這一點,我在聊天室的客戶端演示程序的精簡版本的發送方法:
private void send(String string) {
Map<String, Object> map = new HashMap<String, Object>();
map.put("intArray", new int[] {1});
ByteArrayOutputStream baos = new ByteArrayOutputStream();
XMLEncoder xmlEncoder = new XMLEncoder(baos);
xmlEncoder.writeObject(map);
xmlEncoder.close();
Map<String, Object> encodedMap = new HashMap<String, Object>();
try {
String encoded = baos.toString("UTF-8");
encodedMap.put("xmlpayload", encoded);
} catch (Exception e) {
throw new RuntimeException("could not use UTF-8", e);
}
bayreuxClient.publish("/prototype/a", encodedMap, String.valueOf(System.currentTimeMillis()));
}
這對於現在創建扁平化到一個UTF-8編碼的字節流的XML代碼段(我知道我也需要照顧編碼,但現在不是這個問題)。
消息監聽器接受這個樣子:
listener = new MessageListener() {
@Override
public void deliver(Client fromClient, Client toClient, Message msg) {
if (!_connected) {
_connected = true;
synchronized (this) {
this.notify();
}
}
Object data = msg.getData();
if (data instanceof Map) {
Map map = (Map) data;
Object rawPayload = map.get("xmlpayload");
if (rawPayload instanceof String) {
System.out.println("xmlpayload = " + rawPayload);
ByteArrayInputStream bais;
try {
String xmlPayload = ((String) rawPayload).replaceAll(">",">").replaceAll("<", "<").replaceAll("&","&");
bais = new ByteArrayInputStream(xmlPayload.getBytes("UTF-8"));
XMLDecoder xmlDecoder = new XMLDecoder(bais);
Object o = xmlDecoder.readObject();
xmlDecoder.close();
System.out.println(">> decoded payload=" + o + ", class=" + o.getClass());
} catch (UnsupportedEncodingException e) {
throw new RuntimeException("no UTF-8", e);
}
}
}
}
};
address = new Address("localhost", 8080);
bayreuxClient = new BayeuxClient(httpClient, address, "/cometd/cometd");
bayreuxClient.addListener(listener);
正如你可以看到我已經通過反覆試驗發現,發送的字符串有其小於,大於,&符保護我,然後取消保護並打開XMLDecode。
的輸出是:
xmlpayload = <?xml version="1.0" encoding="UTF-8"?>
<java version="1.6.0_16" class="java.beans.XMLDecoder">
<object class="java.util.HashMap">
<void method="put">
<string>intArray</string>
<array class="int" length="1">
<void index="0">
<int>1</int>
</void>
</array>
</void>
</object>
</java>
>> decoded payload={intArray=[[email protected]}, class=class java.util.HashMap
所以它是可逆的。我將這些字符置於XMLEncoded/XMLDecoded字符串對象中的實驗並不好 - 它們沒有被雙重保護 - 所以我的蠻力解碼也影響了它們。
的問題是:什麼是這些字符串解碼正確方法是什麼?是否有我需要使用的JSON庫,而不是我的快速和髒代碼?可能我在Java客戶端庫中遇到了cometd錯誤?
(注意:我一直在使用cometd-1.0.0rc0庫進行這個實驗)。
編輯:原來,通信通過在同一個網絡服務器比我認爲拿着的cometd通信照顧另一個部署發生了,那部署包含filter.json該做的XML保護。
http://groups.google.com/group/cometd-users/browse_thread/thread/6fbdaae669e5f9d3
換句話說我的代碼外的配置問題。希望修改後的部署可以解決這個問題。