Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将大型Java对象序列化为Json字符串_Java_Json_Memory_Serialization_Out Of Memory - Fatal编程技术网

将大型Java对象序列化为Json字符串

将大型Java对象序列化为Json字符串,java,json,memory,serialization,out-of-memory,Java,Json,Memory,Serialization,Out Of Memory,我有一个大型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

我有一个大型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)
环境是内存密集型的,因此我不能随意增加堆大小

关于序列化Java对象的更节省内存的方法有什么建议吗?我发现jackson库可以进行流式处理,但很多帖子都提到了另一种方法,即将json字符串反序列化为对象。另外,jacksonlib似乎比gson等其他软件包有更好的性能,我个人还没有尝试过

谢谢。

包含使用Jackson流媒体API的有用提示。更多的谷歌搜索显示了有用和有用的信息

对于内存消耗,我创建了一个简单的程序,生成一个~33MB内存对象,下面是粗略估计:

  • 使用问题中的标准json转换,它最多需要150MB内存
  • 使用jackson流媒体API,它使用高达60MB的数据

但是,我确实需要手动创建JsonGenerator,它高度依赖于对象结构,不可伸缩;同样对于复杂对象,创建JsonGenerator也不太容易。

在什么情况下,您希望将100MB+的数据传输到另一个系统?在大型分布式系统中。检查这是系统的其余部分,而不是java?当您可以使用SOAP时,将如此大的数据转换为JSON似乎非常困难。对象的RMI或序列化可以更好地复制
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;
}