2013-03-07 5 views
0

У меня есть решение, в котором мне нужно иметь возможность регистрировать несколько объектов JSON в файле. По существу, делает один файл журнала в день. Каков самый простой способ написать (и позже прочитать) их из одного файла?Регистрация нескольких объектов JSON в одном файле - Формат файла

Как работает MongoDB с BSON? Что он использует в качестве разделителя между «записями»?

Будут ли протокольные буферы, BSON, MessagePack и т. Д. Предлагать сжатие и концепцию записи? Сжатие было бы хорошей выгодой.

ответ

0

С протоколом буферов можно определить сообщение следующим образом:

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.

 Смежные вопросы

  • Нет связанных вопросов^_^