Я хочу, чтобы произвольные XMLEncoded java-объекты возвращались назад и вперед с использованием Do cometd-каналов, и у меня есть проблема, правильно декодирующая полезную нагрузку.Правильный способ декодирования ответа в клиенте dojo 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()));
}
Который сейчас создает XML-фрагмент сплющенный в поток байтов UTF-8 кодируются (Мне известно, что мне тоже нужно позаботиться о кодировке, но теперь это не проблема).
Слушатель сообщение принимая это выглядит следующим образом:
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 для этого эксперимента).
EDIT: Оказалось, что общение происходило через другое развертывание в том же веб-сервере, чем тот, который я думал, заботился о cometd связи и что развертывания содержатся filter.json, которые сделали XML защита.
http://groups.google.com/group/cometd-users/browse_thread/thread/6fbdaae669e5f9d3
Другими словами вопрос конфигурации вне моего кода. Надеемся, что исправленное развертывание устранит эту проблему.