2

我正在使用 DataContractJsonSerializer 序列化批量数据,但遇到错误即。引发了“System.OutOfMemoryException”类型的异常。

public static string MyDataContractJsonSerializer(object objToSerialize, Type objType)
{
        DataContractJsonSerializer ser = new DataContractJsonSerializer(objType);
        System.IO.MemoryStream st1 = new System.IO.MemoryStream();
        ser.WriteObject(st1, objToSerialize);  //Error encountering here.. Exception of type 'System.OutOfMemoryException' was thrown.
        byte[] barray = st1.ToArray(); 
        string abc = System.Text.Encoding.ASCII.GetString(barray);
        return abc;
}

我该如何解决这个问题?

请告诉我序列化批量数据的任何替代方法。

请帮我。

4

3 回答 3

0

这是因为要序列化的对象的大小是无限的。

如果它是一个大对象,你最好将它分解成更小的块,并一个一个地序列化它们。

于 2012-10-09T12:36:26.727 回答
0

在您提到的评论部分中,您希望将序列化数据发送到客户端浏览器(javascript 客户端)。在这种情况下,您不应该将对象序列化为MemoryStream. 那是对内存的无用浪费。如果这是一个 ASP.NET 应用程序,您可以直接将对象序列化为Response.OutputStream.

例如,您的方法可能如下所示:

public static void MyDataContractJsonSerializer(
    object objToSerialize, 
    Type objType, 
    Stream output
)
{
    DataContractJsonSerializer ser = new DataContractJsonSerializer(objType);
    ser.WriteObject(output, objToSerialize);
}

然后在调用方法时直接传递响应输出流。例如,如果您从通用 ASHX 处理程序调用此方法:

public class MyHandler : IHttpHandler
{
    public void ProcessRequest(HttpContext context)
    {
        context.Response.ContentType = "application/json";

        var objToSerialize = ...

        SerializerClass.MyDataContractJsonSerializer(
            objToSerialize, 
            objToSerialize.GetType(), 
            context.Response.OutputStream
        );
    }

    public bool IsReusable
    {
        get
        {
            return false;
        }
    }
}
于 2012-10-09T14:00:17.033 回答
0

您还可以序列化为流(即 FileStream)。这样您就可以序列化千兆字节的数据而不会出现 OutOfMemory 异常。

        public static void Serialize<T>(T obj, string path)
        {
            DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T));
            Stream stream = File.OpenWrite(path);
            serializer.WriteObject(stream, obj);
        }

        public static T Deserialize<T>(string path)
        {
            DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T));
            Stream stream = File.OpenRead(path);
            return (T)serializer.ReadObject(stream);
        }
于 2016-10-24T06:33:30.517 回答