Frage

Ich möchte beliebige XMLEncoded java schieben Objekte hin und her Dojo cometd Kanäle, und ich habe ein Problem richtig die Nutzlast Decodierung.

Um das ich diese Sendemethode in einer abgespeckten Version des Chat-Raum Client Demonstrationsprogramm zu tun haben:

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()));
}

Was jetzt einen XML-Schnipsel in einen UTF-8 kodierten Bytedatenstream abgeflacht erzeugt (Ich weiß, ich brauche auch die Codierung zu kümmern, aber das ist nicht das Problem jetzt).

Die Nachricht Hörer dieser Annahme wie folgt aussehen:

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

Wie man sehen kann ich durch Versuch und Irrtum gefunden haben, dass die Zeichenfolge seine gesendet hat weniger als, größer als, und Ampersand Zeichen geschützt, die ich dann Aufheben des Schutzes und rufen xmlDecode auf.

Die Ausgabe lautet:

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=[I@2f1e75}, class=class java.util.HashMap

so ist es reversibel. Meine Experimente mit diesen Zeichen in String-Objekte setzen XMLEncoded / XMLDecoded zu sein waren nicht gut - sie sind nicht proctected doppelt wurden -. So meine Brute-Dekodierung betroffen sie auch

Die Frage ist: Was ist der richtige Weg, um diese Zeichenfolge zu entschlüsseln? Gibt es eine JSON-Bibliothek Ich brauche statt meinem quick and dirty-Code verwenden? Kann ich habe einen Fehler in der Java-Client-Bibliothek für cometd schlagen?

(Anmerkung: Ich habe für dieses Experiment der cometd-1.0.0rc0 Bibliotheken wurde unter Verwendung)

.

EDIT: Es stellte sich heraus, dass die Kommunikation durch einen anderen Einsatz in demselben Webserver passiert als das I dachte kümmerte sich um die cometd Kommunikation und , die Bereitstellung enthaltenen Filter .json, die den XML-Schutz haben.

http://groups.google.com/group/cometd -Anwender / browse_thread / thread / 6fbdaae669e5f9d3

Mit anderen Worten: ein Konfigurationsproblem vor meinem Code. Hoffentlich ein überarbeiteter Einsatz wird dieses Problem beheben.

War es hilfreich?

Lösung

Die beste Bibliothek unescape XML zu verwenden, ist Apache Commons Lang,

   StringEscapeUtils.unescapeXml();

Sieht aus wie dies ein Fehler in dem Client Bayeux Java ist, dass Sie verwenden. Seine Codierung / Decodierung ist nicht symmetrisch. Ich wollte es benutzen. Jetzt werde ich zweimal überlegen:)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top