الطريقة الصحيحة لفك تشفير استجابة في عميل Dojo Cometd Java

StackOverflow https://stackoverflow.com/questions/1487126

سؤال

أريد أن أدفع كائنات Java التعسفية XMLENCODED ذهابا وإيابا باستخدام قنوات Dojo Cometd، ولدي مشكلة فك شفرة الحمولة بشكل صحيح.

من أجل القيام بذلك، لدي هذه الطريقة إرسالها في إصدار تجريد من برنامج مظاهرة عميل غرفة الدردشة:

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("&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);

كما ترون أنني قد وجدت عن طريق التجربة والخطأ أن السلسلة المرسلة لها أقل من، وأكبر من شخصيات Ampersand المحمية التي أقوم بها ثم نقلت ثم استدعاء 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=[I@2f1e75}, class=class java.util.HashMap

لذلك هو عكسها. تجربتي مع وضع هذه الشخصيات داخل كائنات السلسلة كونها XMLEncoded / XMLDECoded لم تكن جيدة - أنها لم تكن مزدوجة proctected - لذلك تأثرت فك التشفير الغاشد أيضا.

السؤال هو: ما هو لائق طريقة لفك تشفير هذه السلاسل؟ هل هناك مكتبة JSON أحتاج إلى استخدامها بدلا من رمزك السريع والقذرة؟ هل قد أصبت خطأ في مكتبة عميل Java للمزينة؟

(ملاحظة: لقد كنت أستخدم مكتبات CAMETD-1.0RC0 الخاصة بهذه التجربة).


تحرير: اتضح أن الاتصال حدث من خلال نشر آخر في نفس خادم الويب من واحد فكرت اعتني بالاتصالات Cometd، و الذي - التي النشر الموجود في Filter.json الذي قام بحماية XML.

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

وبعبارة أخرى مشكلة التكوين خارج التعليمات البرمجية الخاصة بي. نأمل أن يعالج النشر المنقح هذه المشكلة.

هل كانت مفيدة؟

المحلول

أفضل مكتبة للاستخدام إلى Unescape XML هي Apache Commons Lang،

   StringEscapeUtils.unescapeXml();

يبدو أن هذا خطأ في عميل Bayeux Java الذي تستخدمه. الترميز / فك التشفير ليست متماثلة. كنت ذاهبا لاستخدامها. الآن سوف أفكر مرتين :)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top