DataSet序列化和OutOfMemoryException

时间:2013-11-18 17:01:25

标签: serialization dataset asp.net-3.5

我有DataSet大约250k行和80列导致StringBuilder抛出OutOfMemoryException(@ System.String.GetStringForStringBuilder(String value,Int32 startIndex,Int32 length,Int32 capacity) )在我的数据集上调用.GetXml()时。

当我阅读here (last paragraph)时,可以通过使用二进制表示而不是xml来克服这一点,这听起来很合理。 所以我将我的数据集上的RemotingFormat属性设置为二进制,但问题仍然存在。

我仔细研究了GetXml实现,似乎没有基于RemotingFormat的区别。相反,我发现GetXmlSchemaForRemoting考虑了RemotingFormat,但这个方法是内部的,所以我不能从外面调用它。它由私有Seri​​alizeDataSet调用,由公共GetObjectData调用。 GetObjectData本身似乎是用于自定义序列化。

如何二进制(反)序列化我的数据集?或者至少调用GetXml而不抛出异常?我是否忽略了任何数据集属性?

2 个答案:

答案 0 :(得分:3)

您在问题中提供的链接是从2008年开始的。

还有一些新的讨论:

dotnespider 2009

以及SO 2011

最后一个是关于DataAdapter在阅读150K记录时的问题,但答案也可能对你有意义:

  

我要检查的第一件事是你要返回多少列,   以及他们的数据类型。

  

...要么返回的方式多于你需要的字段,要么就是   一些字段是非常大的字符串或二进制数据。尝试   减少select语句只返回那些字段   绝对需要显示器。

     

如果这不起作用,您可能需要从DataTable移动到列表   自定义数据类型(具有适当字段的类)。

来自accepted answer

答案 1 :(得分:1)

正如您所发现的,没有内置的方法将数据集序列化为二进制文件。

将数据集序列化为二进制数据的唯一方法是实现自己的格式化程序。
从这里开始http://msdn.microsoft.com/en-us/magazine/cc163911.aspx