none
BinaryFormatter序列化大容量数据, 会产生System.OutOfMemoryException异常 RRS feed

  • 问题

  • 以下为示例代码, 当输入15000时或者以上会产生System.OutOfMemoryException异常,

    另外同样的数据源, 使用DataTable和Object执行序列化, 得到的流长度差了两倍.

    如何才能突破BinaryFormatter的容量, 另外DataTable和Object序列化后的不同如何解决.

    protected void Serialize(int rowCount)
    
            {
    
                Console.WriteLine("时间:{0:yyyy-MM-dd HH:mm:ss ddd}, 序列化数据, 共{1}行.", DateTime.Now, rowCount);
    
                //创建数据源
    
                DataTable dt = new DataTable();
    
                for (int index = 0; index < 100; index++)
    
                {
    
                    dt.Columns.Add(string.Format("Col{0}", index), typeof(string));
    
                }
    
                for (int j = 0; j < 2e4; j++)
    
                {
    
                    DataRow newRow = dt.NewRow();
    
                    for (int index = 0; index < 100; index++)
    
                    {
    
                        newRow[string.Format("Col{0}", index)] = string.Format("数值({0}) 加 数字({1}) 等于 值({2})", index, j, index + j);
    
                    }
    
                    dt.Rows.Add(newRow);
    
                }
    
                Console.WriteLine("时间:{0:yyyy-MM-dd HH:mm:ss ddd}, 已建立数据源.", DateTime.Now);
    
                //序列化
    
                MemoryStream stream = new MemoryStream();
    
                new BinaryFormatter().Serialize(stream, dt);
    
                Console.WriteLine("时间:{0:yyyy-MM-dd HH:mm:ss ddd}, 流长度{1:#,###}, 类型DataTable.", DateTime.Now, stream.Length);
    
                //序列化
    
                object obj = dt as object;
    
                new BinaryFormatter().Serialize(stream, obj);
    
                Console.WriteLine("时间:{0:yyyy-MM-dd HH:mm:ss ddd}, 流长度{1:#,###}, 类型Object.", DateTime.Now, stream.Length);
    
            }
    
    
    • 已编辑 yuanbo 2009年5月7日 8:23
    • 已移动 彬慈Moderator 2009年6月18日 8:25 ([Loc]From:微软 .NET 俱乐部(INETA))
    2009年5月7日 8:21

全部回复