Неизвестные символы отображаются в распакованной строке через gzip - PullRequest
1 голос
/ 03 августа 2020

У меня есть мобильное приложение, в котором я сжимаю строку JSON с помощью gzip и сохраняю данные в базе данных. У меня также есть веб-приложение, которое распаковывает ту же строку JSON для отображения данных на веб-странице. Проблема в том, что в строке JSON при распаковке в веб-приложении появляются неизвестные символы, которые не видны при распаковке в мобильном приложении.

Приложение Android записано в Java и использует следующий код для сжатия строки:

ByteArrayOutputStream baos = new ByteArrayOutputStream();
GZIPOutputStream gzipOut = null;
try {
    gzipOut = new GZIPOutputStream(baos);
    ObjectOutputStream objectOut = new ObjectOutputStream(gzipOut);
    objectOut.writeObject(jsonData);
    objectOut.close();

    // Wrapper for the byte array
    ServerData nData = new ServerData();
    nData.data = baos.toByteArray();
    String finalData = JSONObjectStringConverter.json.toJson(nData);
    return finalData;
} catch (IOException e) {
    e.printStackTrace();
}

Кажется, что приведенное выше работает правильно, сохраняя массив байтов в оболочке, а затем в базе данных.

Веб-приложение использует a nodejs backend и использует следующий код для распаковки данных после того, как они извлечены из базы данных и удалены из оболочки:

try{
   // Convert the byte array back to JSON 
    const decompressedData = zlib.gunzipSync(new Uint8Array(compressedByteArray) );
    jsonData = optionDataInflated.toString();
}catch(e){
    console.error(e)
}

Опять же, это в основном работает, но есть некоторые неопознанные символы в начало строки:

"��\u0000\u0005t��{\"cloudData\": ..."

Я подумал, что это может иметь какое-то отношение к заголовку сжатой строки (то есть первые 10 байтов в массиве байтов):

[31, -117, 8, 0, 0, 0, 0, 0, 0, 0,...

но я не смог добиться в этом большого прогресса. Есть ли у кого-нибудь другие предложения относительно того, в чем может быть проблема?

1 Ответ

1 голос
/ 03 августа 2020

ObjectOutputStream является частью общего механизма Java сериализации объектов, и вам будет сложно заставить его работать с nodejs.

Избавьтесь от потока объектов и напишите свой JSON прямо в поток gzip. Предполагая, что jsonData является строкой, используйте:

gzipOut.write(jsonData.getBytes("UTF8"));
gzipOut.close();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...