【问题标题】:How can serialize bulk data by using DataContractJsonSerializer?如何使用 DataContractJsonSerializer 序列化批量数据?
【发布时间】:2012-09-29 16:27:34
【问题描述】:

我正在使用 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;
}

我该如何解决这个问题?

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

请帮帮我。

【问题讨论】:

  • 你想对序列化的数据做什么?将其保存到文件中?通过网络发送?还有什么?我非常怀疑您是否想将其保留在内存中。如果数据很大,您可能会遇到问题。
  • 我想把它发送到javascript(客户端浏览器)。
  • 我正在发送一条消息以使用 ajax 从数据库中获取数据并希望得到响应。
  • 先生,objToSerilize 包含大数据,如 DataSet 中的 10000 行。
  • 有必要发回这么多数据吗?

标签: c# c#-4.0 c#-3.0 datacontractserializer


【解决方案1】:

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

如果是大对象,最好将其分解成更小的块,并一一序列化。

【讨论】:

  • 这是不可能的,因为对象不包含更多成员。我的意思是,对象只有两个成员,例如。 obj.dataTb 和 obj.isSuccess。并且长度 obj.dataTb 超出。
  • 您可以将 obj.dataTb 分解为块,每个块包含几行。
  • 100 行一个块? 1000 行一个块?这个数字完全取决于你。
  • 单行可以包含批量数据。所以它对我不起作用。
【解决方案2】:

在您提到的 cmets 部分中,您希望将序列化数据发送到客户端浏览器(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;
        }
    }
}

【讨论】:

  • 你是对的先生..可以直接在上下文中写。但是 ser.WriteObject(output, objToSerialize);遇到错误“抛出'System.OutOfMemoryException'类型的异常。”上面的解决方案是什么。
  • 即使您不使用 MemoryStream 而是直接写入响应,您也会收到 OutOfMemoryException
【解决方案3】:

您还可以序列化为流(即 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);
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多