2015-08-06 2 views
3

Я пытаюсь получить объект msgpack, отправленный сервером rails в AsyncTask.Извлечение Msgpack из запроса Http в java

Rails контроллер - Рельсы

respond_to do |format| 
     format.json { render json: data.to_json } 
     format.msgpack { render msgpack: data.to_msgpack } 
end 

AsyncTask - Java

 HttpEntity messageEntity = httpResponse.getEntity(); 

      if (messageEntity != null) { 
       MessagePack msgpack = new MessagePack(); 

       ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
       messageEntity.writeTo(baos); 
       byte[] bytes = baos.toByteArray(); 

       msgpack.read(bytes);  

       [...] 
      } 

Мой объект походит на следующие один

{ 
    "aspects": { 
     "1438166757890": { 
      "deleted": "0", 
      "name": "Choc", 
      "updated": "1438166757889" 
     }, 
    [...] 
    }, 
    "items": { 
     "1438166757872": { 
      "aspects": [ 
       1438166757890, 
       1438166757905, 
       1438166757929, 
       1438166757947, 
       1438166757964, 
       1438166757980, 
       1438166757997 
      ], 
      "deleted": "0", 
      "name": "OTHER", 
      "updated": "1438166757872" 
     }, 
    [...] 
    } 
} 

Но когда я пытаюсь прочитать его с моим msgpack объект подобный

Value v = msgpack.read(bytes);

Я имею эту ошибку

java.io.IOException: Invalid byte: -39

Или, когда я использую эти виды шаблонов

Map<String, Map<Integer, Map<String, String>>> v = msgpack.read(bytes, k);

Я получаю

org.msgpack.MessageTypeException: Unexpected array value или org.msgpack.MessageTypeException: Unexpected map value

Я не нашел никакой хорошей документации по Stack или Google относительно этого способа чтения. Официальный сайт Msgpack сериализации и десериализации List<String>

List<String> src = new ArrayList<String>(); 
src.add("msgpack"); 
src.add("kumofs"); 
src.add("viver"); 

MessagePack msgpack = new MessagePack(); 

byte[] raw = msgpack.write(src); 

Value dynamic = msgpack.read(raw); 
List<String> dst2 = new Converter(dynamic) 
    .read(Templates.tList(Templates.TString)); 

ли кто-то уже имел эту проблему, и если да, как управлять шаблонами Msgpack в Java?

Edit:

StackTrace, когда я использую msgpack.read(bytes); без шаблонов:

W/System.err(2999): java.io.IOException: Invalid byte: -39 
W/System.err(2999): at org.msgpack.unpacker.MessagePackUnpacker.readOneWithoutStackLarge(MessagePackUnpacker.java:323) 
W/System.err(2999): at org.msgpack.unpacker.MessagePackUnpacker.readOneWithoutStack(MessagePackUnpacker.java:139) 
W/System.err(2999): at org.msgpack.unpacker.MessagePackUnpacker.readOne(MessagePackUnpacker.java:73) 
W/System.err(2999): at org.msgpack.unpacker.MessagePackUnpacker.readValue(MessagePackUnpacker.java:559) 
W/System.err(2999): at org.msgpack.unpacker.AbstractUnpacker.readValue(AbstractUnpacker.java:65) 
W/System.err(2999): at org.msgpack.MessagePack.read(MessagePack.java:297) 
W/System.err(2999): at org.msgpack.MessagePack.read(MessagePack.java:283) 

И когда я использую

Template<Map<String, String>> map2 = Templates.tMap(Templates.TString, Templates.TString); 

Map<String, String> v = msgpack.read(bytes, map2); 

StackTrace:

W/System.err(1510): org.msgpack.MessageTypeException: Unexpected array value 
W/System.err(1510): at org.msgpack.unpacker.Accept.acceptArray(Accept.java:79) 
W/System.err(1510): at org.msgpack.unpacker.MessagePackUnpacker.readOneWithoutStackLarge(MessagePackUnpacker.java:264) 
W/System.err(1510): at org.msgpack.unpacker.MessagePackUnpacker.readOneWithoutStack(MessagePackUnpacker.java:139) 
W/System.err(1510): at org.msgpack.unpacker.MessagePackUnpacker.readOne(MessagePackUnpacker.java:73) 
W/System.err(1510): at org.msgpack.unpacker.MessagePackUnpacker.readString(MessagePackUnpacker.java:472) 
W/System.err(1510): at org.msgpack.template.StringTemplate.read(StringTemplate.java:46) 
W/System.err(1510): at org.msgpack.template.StringTemplate.read(StringTemplate.java:25) 
W/System.err(1510): at org.msgpack.template.AbstractTemplate.read(AbstractTemplate.java:31) 
W/System.err(1510): at org.msgpack.template.MapTemplate.read(MapTemplate.java:72) 
W/System.err(1510): at org.msgpack.template.MapTemplate.read(MapTemplate.java:27) 
W/System.err(1510): at org.msgpack.template.AbstractTemplate.read(AbstractTemplate.java:31) 
W/System.err(1510): at org.msgpack.template.MapTemplate.read(MapTemplate.java:72) 
W/System.err(1510): at org.msgpack.template.MapTemplate.read(MapTemplate.java:27) 
W/System.err(1510): at org.msgpack.template.AbstractTemplate.read(AbstractTemplate.java:31) 
W/System.err(1510): at org.msgpack.template.MapTemplate.read(MapTemplate.java:72) 
W/System.err(1510): at org.msgpack.template.MapTemplate.read(MapTemplate.java:27) 
W/System.err(1510): at org.msgpack.template.AbstractTemplate.read(AbstractTemplate.java:31) 
W/System.err(1510): at org.msgpack.MessagePack.read(MessagePack.java:510) 
W/System.err(1510): at org.msgpack.MessagePack.read(MessagePack.java:479) 
+0

Могли бы вы пожалуйста, выложите stacktraces из исключений? – naXa

ответ

3

Благодаря анализу @naXa, я решил найти другое сообщение msgpack на git. После некоторых исследований я нашел MessagePack for Java.

Файлы, извлеченные, я использовал sbt для создания файлов .jar оттуда командой ./sbt publish local.

После завершения строительства у меня были основные, исходные и javadoc .jar файлы в следующем каталоге: ~/msgpack-java-07-develop/msgpack-core/target.

Я импортировал все мои .jar файлы в моем проекте затмений, изменил путь сборки, а затем, чтобы получить мой msgpack содержание, я мог бы написал эти простые линии, чтобы получить мою карту, содержащую мои ценности:

HttpEntity messageEntity = httpResponse.getEntity(); 

if (messageEntity != null) { 
    MessagePack msgpack = new MessagePack(); 

    MessageUnpacker u = msgpack.newUnpacker(messageEntity.getContent()); 
    MapValue mv = (MapValue) u.unpackValue(); 

    Map<Value, Value> map = mv.map(); 
+0

Не могли бы вы сообщить мне версию библиотеки пакетов сообщений, которую вы использовали. Я работаю над проектом на основе градиента и использовал версию 0.8.11. новый MessagePack(); дает ошибку, говоря, что этот конструктор является закрытым. –

1

Не ответ! Просто небольшой анализ.

the class Вот и коды откуда IOException брошен

default: 
    // System.out.println("unknown b "+(b&0xff)); 
    // headByte = CS_INVALID 
    headByte = REQUIRE_TO_READ_HEAD; 
    throw new IOException("Invalid byte: " + b); // TODO error FormatException 
} 

Я думаю, что msgpack для Android является устаревшей и не знает типа с кодом -39 (-0x27). Проверьте различия в типах между msgpack for Android и msgpack, которые вы используете на стороне сервера.

A - в -39 также выглядит подозрительно ..