我有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,但这个方法是内部的,所以我不能从外面调用它。它由私有SerializeDataSet调用,由公共GetObjectData调用。 GetObjectData本身似乎是用于自定义序列化。
如何二进制(反)序列化我的数据集?或者至少调用GetXml而不抛出异常?我是否忽略了任何数据集属性?
答案 0 :(得分:3)
您在问题中提供的链接是从2008年开始的。
还有一些新的讨论:
以及SO 2011。
最后一个是关于DataAdapter
在阅读150K记录时的问题,但答案也可能对你有意义:
我要检查的第一件事是你要返回多少列, 以及他们的数据类型。
和
来自accepted answer 的...要么返回的方式多于你需要的字段,要么就是 一些字段是非常大的字符串或二进制数据。尝试 减少select语句只返回那些字段 绝对需要显示器。
如果这不起作用,您可能需要从DataTable移动到列表 自定义数据类型(具有适当字段的类)。
答案 1 :(得分:1)
正如您所发现的,没有内置的方法将数据集序列化为二进制文件。
将数据集序列化为二进制数据的唯一方法是实现自己的格式化程序。
从这里开始http://msdn.microsoft.com/en-us/magazine/cc163911.aspx