作者:aaaa | 来源:互联网 | 2023-08-24 00:18
问题麻烦各位了,看有没有碰到过这个的,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<>)
}
看看能够满足你要不