2016-04-19 18 views
3

Ich muss einige Daten aus einem Clob extrahieren und im JSON-Format serialisieren.Gson JSON maximale Größe

Welche maximale Größe kann Gson bewältigen?

https://github.com/google/gson/blob/master/UserGuide.md Hier kann ich nur "Strings: entserialisierten Saiten von über 25MB ohne Probleme" finden

Kontext: Ich benutze ..

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

Mehr im Detail:

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){..} 

Hinweis: In meinem aktuellen Code ist die Begrenzung Integer.MAX_VALUE

Meine Lösung besteht darin, Teile der Daten zu verwenden, die aus der Datenbank abgerufen werden. Ich würde gerne die theoretische maximale Größe wissen, mit der GSON umgehen kann. Ich werde keinen Browser auf der Empfängerseite verwenden.

+1

Ich weiß nicht, ob es eine solche Grenze ist (IMHO, die einzige Grenze hier beteiligt ist Speicher), aber wie über das Schreiben eines Komponententests, um es zu testen? –

Antwort

2

Gson gibt keine Begrenzung vor. Es hat auch keine bekannten architektonischen Beschränkungen.

Ich denke, das Hauptproblem, das Sie mit Ihrem Ansatz konfrontiert werden, ist das Laden der Daten in den Speicher an erster Stelle.

Ich empfehle die Verwendung von Gson Stream API, um den JSON zu schreiben, wie Sie es aus der Datenbank lesen. Verwenden Sie eine JsonWriter und erstellen und streamen Sie Ihr JSON-Objekt.

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

Wo copyStream etwas wie

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

Ich bestätige @sargue Antwort sein könnte. Ich versuchte den folgenden Test und arbeitete wie ein Charme mit der richtigen Menge des dem jvm zugeteilten Heapspeichers.

@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); 
    } 
} 

Dies ist der Konverter verwende ich (mit Halarious) ..