我需要从Clob中提取一些数据并以JSON格式对其进行序列化。
Gson可以处理的最大尺寸是什么?
https://github.com/google/gson/blob/master/UserGuide.md我可以找到 "字符串:超过25MB的反序列化字符串没有任何问题"
上下文:我用..
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可以处理的理论最大大小。我不会在接收方使用浏览器。
答案 0 :(得分:2)
Gson没有施加任何限制。也没有任何已知的建筑限制。
我认为您将面临的主要问题是首先将数据加载到内存中。
我建议您在从数据库中读取JSON时使用Gson流API编写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 :(得分: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)..
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonParseException;
import ch.halarious.core.HalResource;
import ch.halarious.core.HalSerializer;
import ch.halarious.core.HalDeserializer;
import ch.halarious.core.HalExclusionStrategy;
public class EntityHalConverter <T> {
private Gson gson;
private GsonBuilder builder;
private Class<T> paramType;
/* HalConverter<ProgrammeData> halConverter = new HalConverter<>(ProgrammeData.class);
*/
public EntityHalConverter(Class<T> paramType) {
builder = new GsonBuilder();
builder.setExclusionStrategies(new HalExclusionStrategy());
this.paramType = paramType;
}
/* String jsonResult = halConverter.toJson( programmeData );
*/
public String toJson( T result ) throws JsonParseException{
builder.registerTypeAdapter(HalResource.class, new HalSerializer());
gson = builder.create();
return gson.toJson(result, HalResource.class);
}
/* ProgrammeData pcsProg = halConverter.convert( jsonString );
*/
public T fromJson( String json ) throws JsonParseException {
builder.registerTypeAdapter( HalResource.class, new HalDeserializer(paramType) );
gson = builder.create();
return (T)gson.fromJson( json, HalResource.class );
}
}