2016-04-19 16 views
3

Clobからデータを抽出し、JSON形式でシリアル化する必要があります。Gson JSON最大サイズ

Gsonが処理できる最大サイズはいくつですか?

コンテキスト:私が使用して...詳細

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

より:

:私はちょうど "何の問題もなく25メガバイト以上の非直列化文字列文字列" を見つけることができます

ここ

https://github.com/google/gson/blob/master/UserGuide.md

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です

私の解決策は、DBから取得したデータのチャンクを使用することになります。 GSONが処理できる理論的な最大サイズを知りたい。私は受信側でブラウザを使用しません。

+1

..私は(Halariousで)使用しているコンバータですが、どのようにそれをテストするためにいくつかの単体テストを書くことについて? –

答えて

2

Gsonには何も制限はありません。それにはいかなる既知の建築上の制限もありません。

あなたのアプローチで直面する主な問題は、最初にメモリにデータを読み込むことだと思います。

JSONをデータベースから読み込むときに、GsonストリームAPIを使用して書き込むことをおすすめします。 JsonWriterを使用し、JSONオブジェクトを作成してストリームします。 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

のようなものかもしれない

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

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

これは、そのような制限は(私見、ここでは関係する唯一の制限は、メモリである)があるかどうかはわからない