С протоколом буферов можно определить сообщение следующим образом:
Message JSONObject {
required string JSON = 1;
}
Message DailyJSONLog {
repeated JSONObject JSON = 1;
}
Таким образом, вы бы просто прочитать файл из памяти и десериализации его. Это, по сути, то же самое и для их сериализации. Как только у вас есть файл (сериализованный DailyJSONLog
) на диске, вы можете просто просто добавить сериализованный JSONObject
s в конец этого файла (так как сообщение DailyJSONLog
- это просто повторное поле).
Единственная проблема заключается в том, что у вас есть много сообщений каждый день или если вы хотите начать в определенном месте в течение дня (вы не можете легко добраться до середины (или произвольного) повторный список).
Я обошел это, взяв JSONObject
, сериализуя его, а затем base64, кодируя его. Я бы сохранил их в файле, разделяющем новую строку. Это позволяет вам очень легко увидеть, сколько записей в каждом файле, получить доступ к любому произвольному объекту JSON в файле и тривиально продолжать расширять файл (вы можете расширить указанное выше «повторяющееся» сообщение, а также довольно тривиально, но это в одном направлении легко работа ...)
Сжатие - это другая тема. Буферы протокола не будут сжимать строки. Если бы вы определили сообщение pb в соответствии с вашим сообщением JSON, вы получите преимущество, заключающееся в том, что pb может «сжать» любые целые числа в их закодированный формат [varint][1]
. Вы получите сжатие «меньше», если попробуете также использовать путь кодирования base64.