将大型 Java 对象序列化为 Json 字符串
Serialize large Java Object to Json Strings
我有一个大型 Java 对象 (100MB+) 需要序列化为 Json 字符串。我一直在使用 jackson Json,直到我发现它达到了大对象的内存限制:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOfRange(Arrays.java:3664)
at java.lang.String.<init>(String.java:207)
at java.lang.StringBuilder.toString(StringBuilder.java:407)
at com.fasterxml.jackson.core.util.TextBuffer.contentsAsString(TextBuffer.java:349)
at com.fasterxml.jackson.core.io.SegmentedStringWriter.getAndClear(SegmentedStringWriter.java:83)
at com.fasterxml.jackson.databind.ObjectWriter.writeValueAsString(ObjectWriter.java:682)
at JavaTest.objToJson(JavaTest.java:76)
进行转换的方法如下所示:
public static String objToJson(Object obj) {
ObjectWriter ow = new ObjectMapper().writer().withDefaultPrettyPrinter();
String json = null;
try {
json = ow.writeValueAsString(obj);
} catch (JsonProcessingException e) {
System.out.println("Error in objToJson(): " + e);
e.getMessage();
e.printStackTrace();
}
return json;
}
环境是内存密集型的,因此我无法随意增加堆大小。
关于序列化 Java 对象的内存效率更高的方法有什么建议吗?我发现 jackson library can do streaming 但许多帖子说的是相反的方式,即将 json 字符串反序列化为对象。另外,jackson lib似乎比其他我没有亲自尝试过的包比如gson有更好的性能。
谢谢。
contains useful hint of using Jackson Streaming API. Some more Google searches show useful examples here and here.
对于内存消耗,我创建了一个简单的程序,生成了大约 33MB 的内存对象,这是粗略的估计:
- 在问题中使用标准 json 转换,它最多使用 ~150MB 内存
- 使用 jackson streaming API,它最多使用 ~60MB
但是,我确实需要手动创建JsonGenerator,它高度依赖于对象结构并且不可扩展;同样对于复杂的对象,创建 JsonGenerator 也不是很容易。
我有一个大型 Java 对象 (100MB+) 需要序列化为 Json 字符串。我一直在使用 jackson Json,直到我发现它达到了大对象的内存限制:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOfRange(Arrays.java:3664)
at java.lang.String.<init>(String.java:207)
at java.lang.StringBuilder.toString(StringBuilder.java:407)
at com.fasterxml.jackson.core.util.TextBuffer.contentsAsString(TextBuffer.java:349)
at com.fasterxml.jackson.core.io.SegmentedStringWriter.getAndClear(SegmentedStringWriter.java:83)
at com.fasterxml.jackson.databind.ObjectWriter.writeValueAsString(ObjectWriter.java:682)
at JavaTest.objToJson(JavaTest.java:76)
进行转换的方法如下所示:
public static String objToJson(Object obj) {
ObjectWriter ow = new ObjectMapper().writer().withDefaultPrettyPrinter();
String json = null;
try {
json = ow.writeValueAsString(obj);
} catch (JsonProcessingException e) {
System.out.println("Error in objToJson(): " + e);
e.getMessage();
e.printStackTrace();
}
return json;
}
环境是内存密集型的,因此我无法随意增加堆大小。
关于序列化 Java 对象的内存效率更高的方法有什么建议吗?我发现 jackson library can do streaming 但许多帖子说的是相反的方式,即将 json 字符串反序列化为对象。另外,jackson lib似乎比其他我没有亲自尝试过的包比如gson有更好的性能。
谢谢。
对于内存消耗,我创建了一个简单的程序,生成了大约 33MB 的内存对象,这是粗略的估计:
- 在问题中使用标准 json 转换,它最多使用 ~150MB 内存
- 使用 jackson streaming API,它最多使用 ~60MB
但是,我确实需要手动创建JsonGenerator,它高度依赖于对象结构并且不可扩展;同样对于复杂的对象,创建 JsonGenerator 也不是很容易。