2009-09-28 53 views
0

响应我要推任意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("&gt;",">").replaceAll("&lt;", "<").replaceAll("&amp;","&"); 
     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 = &lt;?xml version="1.0" encoding="UTF-8"?&gt; 
&lt;java version="1.6.0_16" class="java.beans.XMLDecoder"&gt; 
&lt;object class="java.util.HashMap"&gt; 
    &lt;void method="put"&gt; 
    &lt;string&gt;intArray&lt;/string&gt; 
    &lt;array class="int" length="1"&gt; 
    &lt;void index="0"&gt; 
    &lt;int&gt;1&lt;/int&gt; 
    &lt;/void&gt; 
    &lt;/array&gt; 
    &lt;/void&gt; 
&lt;/object&gt; 
&lt;/java&gt; 

>> 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

换句话说我的代码外的配置问题。希望修改后的部署可以解决这个问题。

回答

0

用来UNESCAPE XML最好的图书馆就是Apache Commons Lang中,

StringEscapeUtils.unescapeXml(); 

看起来这是在你使用的贝叶Java客户端的错误。其编码/解码不对称。我打算使用它。现在我会三思:)