2016-04-19 4 views
3

Мне нужно извлечь некоторые данные из Clob и сериализовать его в формате JSON.Gson JSON max размер

Каков максимальный размер, который может обрабатывать Gson?

Здесь https://github.com/google/gson/blob/master/UserGuide.md я могу просто найти "Строки: десериализованное строки над 25Мб без каких-либо проблем"

Контекст: я использую ..

ResultSet.getClob() 
-> BufferedReader 
-> String singleLine 
-> StringBuilder 
-> String "jsonAttribute" to serialize 

Подробнее:

try{ 

    StringBuilder sb = new StringBuilder(); 
    BufferedReader br = new BufferedReader(resultset.getClob(2).getCharacterStream()); 
    String line; 
    try{ 
     while ((line = br.readLine()) != null) { 
      sb.append(line).append("\n"); 
     } 
    }catch(IOException ee){ 
     // logger 
     throw ee; 
    } 

    String jsonAttribute = sb.toString(); 

}catch(Exception xx){..} 

Примечание: в моем текущем коде ограничение ограничено Integer.MAX_VALUE

Мое решение будет состоять в использовании фрагментов данных, извлеченных из БД. Я хотел бы знать теоретический максимальный размер, который может обрабатывать GSON. Я не буду использовать браузер на принимающей стороне.

+1

Я не знаю, есть ли такой предел (ИМХО, единственный предел участвует здесь память), но как о написании какого-либо модульного теста, чтобы проверить его? –

ответ

2

Gson не налагает никаких ограничений. И у него нет каких-либо известных архитектурных ограничений.

Я думаю, что основная проблема, с которой вы столкнетесь в своем подходе, - это загрузка данных в память в первую очередь.

Я рекомендую использовать API-интерфейс Gson для записи JSON по мере его чтения из базы данных. Используйте JsonWriter и создайте и передайте свой объект JSON.

Reader reader = resultset.getClob(2).getCharacterStream(); 
JsonWriter jsonWriter = new JsonWriter(someOutputStream); 
copyStream(reader, someOutputStream); 

Где copyStream может быть что-то вроде

public static void copyStream(Reader istream, Writer ostream) throws IOException { 
    char buffer[] = new char[2048]; 
    while (true) { 
    int len = istream.read(buffer); 
    if (len == -1) 
     return; 
    ostream.write(buffer, 0, len); 
    } 
} 
1

Я подтверждаю @sargue ответ. Я пробовал следующий тест и работал как шарм с нужным количеством памяти кучи, выделенным для jvm.

@Test 
public void testGsonLimitss(){ 

    EntityHalConverter<HugeData> converter = new EntityHalConverter<>(HugeData.class); 
    HugeData hugeData = new HugeData(); 
    converter.toJson(hugeData); 
} 

class HugeData implements HalResource { 

    String big1, big2; 

    public HugeData(){ 
     // big1 = StringUtils.repeat("X", 400000000); // 300 millions chars ~ approx 3 mb. With multibyte chars ..... 3.5 mb 
     big2 = StringUtils.repeat("Y", Integer.MAX_VALUE-10); 
    } 
} 

Это конвертер я использую (с Halarious) ..