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

问题描述

以下为示例代码,当输入15000时或者以上会产生System.OutOfMemoryException异常,另外同样的数据源,使用DataTable和Object执行序列化,得到的流长度差了两倍.如何才能突破BinaryFormatter的容量,另外DataTable和Object序列化后的不同如何解决.protectedvoidSerialize(introwCount){Console.WriteLine("时间:{0:yyyy-MM-ddHH:mm:ssddd},序列化数据,共{1}行.",DateTime.Now,rowCount);//创建数据源DataTabledt=newDataTable();for(intindex=0;index<100;index++){dt.Columns.Add(string.Format("Col{0}",index),typeof(string));}for(intj=0;j<2e4;j++){DataRownewRow=dt.NewRow();for(intindex=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-ddHH:mm:ssddd},已建立数据源.",DateTime.Now);//序列化MemoryStreamstream=newMemoryStream();newBinaryFormatter().Serialize(stream,dt);Console.WriteLine("时间:{0:yyyy-MM-ddHH:mm:ssddd},流长度{1:#,
解决方案二:
},类型DataTable.",DateTime.Now,stream.Length);//序列化objectobj=dtasobject;newBinaryFormatter().Serialize(stream,obj);Console.WriteLine("时间:{0:yyyy-MM-ddHH:mm:ssddd},流长度{1:#,
解决方案三:
},类型Object.",DateTime.Now,stream.Length);}

解决方案

解决方案四:
为了保证但序列化时能够有足够的类型信息,在你在序列化的时候,类型信息也是写入到序列化流内部的。由于DataTable和object的类型信息肯定不一样多,所以会造成序列化结果不一样。或者假设序列化结果完全一样,那么反序列化的结果难道会两样?那时候你又怎么区分是DataTable还是object呢?至于OOM,要看到底是哪里溢出了。一般来说改用64位的操作系统可以减少OOM的情况,另外就是尽可能不要序列化那么大的对象了。
解决方案五:
引用1楼lextm的回复:

为了保证但序列化时能够有足够的类型信息,在你在序列化的时候,类型信息也是写入到序列化流内部的。由于DataTable和object的类型信息肯定不一样多,所以会造成序列化结果不一样。或者假设序列化结果完全一样,那么反序列化的结果难道会两样?那时候你又怎么区分是DataTable还是object呢?至于OOM,要看到底是哪里溢出了。一般来说改用64位的操作系统可以减少OOM的情况,另外就是尽可能不要序列化那么大的对象了。

瞎说,楼主的代码错误MemoryStreamstream=newMemoryStream();newBinaryFormatter().Serialize(stream,dt);Console.WriteLine("时间:{0:yyyy-MM-ddHH:mm:ssddd},流长度{1:#,
解决方案六:
},类型DataTable.",DateTime.Now,stream.Length);//序列化objectobj=dtasobject;newBinaryFormatter().Serialize(stream,obj);同一个stream序列化同一个对象最后流大小当然是第一次序列化的一倍
解决方案七:
LS正确,序列化了两次
解决方案八:
确实同一个对象被序列化了两次,是个Bug.那么BinaryFormatter是否有分布序列化的方式呢,比如每次只写入固定长度的字节到流中,然后转存出去.
解决方案九:
BinaryFormatter.Serialize(Stream,obj);写入后是写到当前Stream的后面.不是重新生成一个Stream.

时间: 2024-11-10 13:12:05

BinaryFormatter序列化大容量数据, 会产生System.OutOfMemoryException异常的相关文章

SQL Server出现System.OutOfMemoryException异常的解决方法_MsSql

今天在用SQL Server 2008执行一个SQL脚本文件时,老是出现引发类型为"System.OutOfMemoryException"的异常错误,脚本明明是从SQL Server 2008导出的,应该不会出错,研究了好久问题才得以解决. 出现这个错误的主要原因是由于SQL脚本文件太大,估计超过了100M了,解决方法就是把脚本文件分成几个脚本文件,分别去执行即可. 来自微软官方的解决方案: 原因: 因为计算机没有足够的内存来完成请求的操作,则会出现此问题. 在 SQL Server

SQL Server出现System.OutOfMemoryException异常的解决方法

今天在用SQL Server 2008执行一个SQL脚本文件时,老是出现引发类型为"System.OutOfMemoryException"的异常错误,脚本明明是从SQL Server 2008导出的,应该不会出错,研究了好久问题才得以解决. 出现这个错误的主要原因是由于SQL脚本文件太大,估计超过了100M了,解决方法就是把脚本文件分成几个脚本文件,分别去执行即可. 来自微软官方的解决方案: 原因: 因为计算机没有足够的内存来完成请求的操作,则会出现此问题. 在 SQL Server

C#多线程安全访问控件,System.OutOfMemoryException异常

问题描述 一直找解决方案,今天发现博客园一个朋友写的C#多线程安全访问控件,http://www.cnblogs.com/slyzly/articles/2121436.htmlprivatevoidSetText(stringtext){//InvokeRequiredrequiredcomparesthethreadIDofthe//callingthreadtothethreadIDofthecreatingthread.//Ifthesethreadsaredifferent,itret

Json.net对5W+数据进行反系列化时报System.OutOfMemoryException

问题描述 Json.net对5W+数据进行反系列化时报System.OutOfMemoryException 当前项目分为前台.后台,前台使用的是.net技术,后台使用的是java,目前问题时在前台使用json.net进行反系列化后台传出的5W多条数据系列化后的字符串时报内存溢出,请问在不能减少查询数据量的情况下,这种问题应该如何处理,json.net不至于处理5W+数据就出问题吧?

在 WCF 中使用高效的 BinaryFormatter 序列化

本文将定义一个 WCF 终结点行为扩展,以在 WCF 中使用更高效的 BinaryFormatter 进行二进制序列化,并实现对是否使用传统二进制序列化功能的可配置. 介绍 实现步骤 使用方法 效果   介绍 在 OEA 框架中,是使用 WCF 作为数据传输框架.但是使用 WCF 内部的二进制序列化,序列化后的数据大小,要比使用传统的 System.Runtime.Serialization.Formatters.Binary.BinaryFormatter 类进行序列化后的数据大小要大得多.作

BCP导出导入 SQL SERVER 大容量数据实践教程

本教程我们介绍大容量数据导出导入的利器--BCP实用工具.同时在后面也介绍BULK INSERT导入大容量数据,以及BCP结合BULK INSERT做数据接口的实践(在SQL2008R2上实践).  1. BCP的用法 BCP 实用工具可以在 Microsoft SQL Server 实例和用户指定格式的数据文件间大容量复制数据.使用 BCP实用工具可以将大量新行导入 SQL Server 表,或将表数据导入数据文件.除非与 queryout 选项一起使用,否则使用该实用工具不需要了解 Tran

在SQL Server中谨慎导入导出大容量数据

在数据库初始化过程中,管理员需要面对的一个现实问题就是如何把大容量的数据导入到数据库系统 中.在SQL Server数据库中提供了一些大容量数据导入导出的工具供数据库管理员实用.如管理员可以通 过bcp实用工具,实现大容量导出数据和大容量导入数据并生成格式化文件.如可以利用bulk insert语句 将大容量数据直接从数据文件导入数据库表或者未分区的视图中去等等. 虽然在SQL Server数据库中提供了这些实用工具.不过管理员在实际工作中,仍然需要谨慎对待这项 工作.具体的来说,在大容量数据导

Android:序列化XML数据

 什么是XML? 首先我们先了解一下什么是XML.XML,可扩展标记语言 (Extensible Markup Language) ,用于标记电子文件使其具有结构性的标记语言,可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言,这是百度百科的解释.而XML是一种在Internet中传输数据的常见格式,它与HTML一样,都是SGML(标准通用标记语言),无论你是需要通过Internet访问数据,或者发送数据给Web服务,都可能需要用到XML的知识.恰恰Android应用

json 解析 .net 序列化的数据

问题描述 json 解析 .net 序列化的数据 服务器是用.net 写的,数据经过序列化,iOS开发中请求的数据该怎么解析,我用json解析后全是数字 解决方案 string content = string.Empty; JavaScriptSerializer json = new JavaScriptSerializer(); foreach (var row in table) { ????????? person p =......答案就在这里:.net JSON序列化数据 解决方案