热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C#DataSet序列化问题

问题麻烦各位了,看有没有碰到过这个的,DataSet序列化报错,错误信息为:System.Runtime.Serialization.SerializationException:

问题


麻烦各位了,看有没有碰到过这个的,DataSet序列化报错,错误信息为:System.Runtime.Serialization.SerializationException:“内部数组不能扩展到大于 Int32.MaxValue 个元素。”
DataSet为包含30万条数据且列为180列的一张表,在进行序列化时报错,求解决方案,google,百度好久好像都说是C#的序列化BUG,麻爪中......,DataSet数据减少就算了,这是客户进行数据统计分析的一个操作,需要把大批量的数据全部加载并显示由客户进行处理,实际数据量可能比这个还要大,至于序列化是因为需要通过Remoting进行数据传输,将数据传到客户端减少流量消耗,以下代码是一简单Demo代码,同样会触发该BUG!

 

1 static void Main(string[] args)
2 {
3 DataSet ds = new DataSet();
4 DataTable dt = new DataTable();
5 for (int i = 0; i <180; i++)
6 {
7 DataColumn dc = new DataColumn();
8 dc.ColumnName = "Column_" + i.ToString();
9 dc.DefaultValue = "Test_" + i.ToString();
10 dt.Columns.Add(dc);
11 }
12 DateTime bft = DateTime.Now;
13 for (int i = 0; i <300000; i++)
14 {
15 DataRow dr = dt.NewRow();
16 for (int j = 0; j <180; j++)
17 {
18 dr[j] = "Row_" + i.ToString() + "_Column_" + j.ToString();
19 }
20 dt.Rows.Add(dr);
21 }
22 DateTime aft = DateTime.Now;
23 TimeSpan nspan = aft.Subtract(bft);
24 Console.WriteLine("添加300000条数据总共花费{0}ms.,{1}s,{2}m", nspan.TotalMilliseconds,nspan.TotalSeconds,nspan.TotalMinutes);
25 ds.Tables.Add(dt);
26 byte[] bArrayResult = null;
27 try
28 {
29 ds.RemotingFormat = SerializationFormat.Binary;
30 MemoryStream ms = new MemoryStream();
31 IFormatter bf = new BinaryFormatter();
32 bf.Serialize(ms, ds);
33 bArrayResult = ms.ToArray();
34 ms.Close();
35 Console.WriteLine("DataSet文件大小:"+GetFileSize(bArrayResult.LongLength));
36 }
37 catch (Exception ex)
38 {
39 throw ex;
40 }
41 }
42
43 ///


44 /// 计算文件大小函数(保留两位小数),Size为字节大小
45 ///

46 ///

初始文件大小
47 ///
48 public static string GetFileSize(long size)
49 {
50 var num = 1024.00; //byte
51 if (size < num)
52 return size + "B";
53 if (size 2))
54 return (size / num).ToString("f2") + "K"; //kb
55 if (size 3))
56 return (size / Math.Pow(num, 2)).ToString("f2") + "M"; //M
57 if (size 4))
58 return (size / Math.Pow(num, 3)).ToString("f2") + "G"; //G
59 return (size / Math.Pow(num, 4)).ToString("f2") + "T"; //T
60 }

Sample Demo



最佳回答


///



/// Table2Model

///


public static class Table2Model {

#region 公共方法(扩展DataTable)

///


/// DataTable转换成T
///

/// 实体类型
///

需转换的数据table
///
public static T ToModel(this DataTable table) where T : new() {
T entity = new T();
foreach (DataRow row in table.Rows) {
foreach (var item in entity.GetType().GetProperties()) {
if (row.Table.Columns.Contains(item.Name)) {
if (DBNull.Value != row[item.Name]) {
item.SetValue(entity, ChangeType(row[item.Name], item.PropertyType), null);
}
}
}
}
return entity;
}
///


/// DataTable转换成T
///

/// 实体类型
///

需转换的数据table
///

外延表重名需加的前缀
///
public static T ToModel(this DataTable table, string ext) where T : new() {
T entity = new T();
foreach (DataRow row in table.Rows) {
foreach (var item in entity.GetType().GetProperties()) {
if (row.Table.Columns.Contains(ext + item.Name)) {
if (DBNull.Value != row[ext + item.Name]) {
item.SetValue(entity, ChangeType(row[ext + item.Name], item.PropertyType), null);
}
}
}
}
return entity;
}
///


/// DataTable转换成List
///

/// 实体类型
///

需转换的数据table
///
public static List ToModelList(this DataTable table) where T : new() {
List entities = new List();
foreach (DataRow row in table.Rows) {
T entity = new T();
foreach (var item in entity.GetType().GetProperties()) {
if (row.Table.Columns.Contains(item.Name)) {
if (DBNull.Value != row[item.Name]) {
item.SetValue(entity, ChangeType(row[item.Name], item.PropertyType), null);
}
}
}
entities.Add(entity);
}
return entities;
}
#endregion 公共方法(扩展DataTable)
#region 私有方法(Convert.ChangeType处理Nullable<>和非Nullable<>)
///


/// 类型转换(包含Nullable<>和非Nullable<>转换)
///

///


///


///
private static object ChangeType(object value, Type conversionType) {
// Note: This if block was taken from Convert.ChangeType as is, and is needed here since we&#39;re
// checking properties on conversionType below.
if (cOnversionType== null) {
throw new ArgumentNullException("conversionType");
} // end if
// If it&#39;s not a nullable type, just pass through the parameters to Convert.ChangeType
if (conversionType.IsGenericType &&
conversionType.GetGenericTypeDefinition().Equals(typeof(Nullable<>))) {
if (value == null) {
return null;
} // end if
// It&#39;s a nullable type, and not null, so that means it can be converted to its underlying type,
// so overwrite the passed-in conversion type with this underlying type
System.ComponentModel.NullableConverter nullableCOnverter= new System.ComponentModel.NullableConverter(conversionType);
cOnversionType= nullableConverter.UnderlyingType;
} // end if
// Now that we&#39;ve guaranteed conversionType is something Convert.ChangeType can handle (i.e. not a
// nullable type), pass the call on to Convert.ChangeType
return Convert.ChangeType(value, conversionType);
}
#endregion 私有方法(Convert.ChangeType处理Nullable<>和非Nullable<>)
}

看看能够满足你要不



推荐阅读
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • SpringBoot uri统一权限管理的实现方法及步骤详解
    本文详细介绍了SpringBoot中实现uri统一权限管理的方法,包括表结构定义、自动统计URI并自动删除脏数据、程序启动加载等步骤。通过该方法可以提高系统的安全性,实现对系统任意接口的权限拦截验证。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文介绍了一个Java猜拳小游戏的代码,通过使用Scanner类获取用户输入的拳的数字,并随机生成计算机的拳,然后判断胜负。该游戏可以选择剪刀、石头、布三种拳,通过比较两者的拳来决定胜负。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • C# 7.0 新特性:基于Tuple的“多”返回值方法
    本文介绍了C# 7.0中基于Tuple的“多”返回值方法的使用。通过对C# 6.0及更早版本的做法进行回顾,提出了问题:如何使一个方法可返回多个返回值。然后详细介绍了C# 7.0中使用Tuple的写法,并给出了示例代码。最后,总结了该新特性的优点。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 从零学Java(10)之方法详解,喷打野你真的没我6!
    本文介绍了从零学Java系列中的第10篇文章,详解了Java中的方法。同时讨论了打野过程中喷打野的影响,以及金色打野刀对经济的增加和线上队友经济的影响。指出喷打野会导致线上经济的消减和影响队伍的团结。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 在开发中,有时候一个业务上要求的原子操作不仅仅包括数据库,还可能涉及外部接口或者消息队列。此时,传统的数据库事务无法满足需求。本文介绍了Java中如何利用java.lang.Runtime.addShutdownHook方法来保证业务线程的完整性。通过添加钩子,在程序退出时触发钩子,可以执行一些操作,如循环检查某个线程的状态,直到业务线程正常退出,再结束钩子程序。例子程序展示了如何利用钩子来保证业务线程的完整性。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文介绍了在Java中gt、gtgt、gtgtgt和lt之间的区别。通过解释符号的含义和使用例子,帮助读者理解这些符号在二进制表示和移位操作中的作用。同时,文章还提到了负数的补码表示和移位操作的限制。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
author-avatar
aaaa
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有