如何序列化/反序列化自定义数据集

本文关键字:自定义 数据集 反序列化 序列化 | 更新日期: 2023-09-27 18:12:15

我有一个winforms应用程序,它使用强类型自定义数据集来保存数据进行处理。它从数据库中填充数据。

我有一个用户控件,它接受任何自定义数据集并在数据网格中显示内容。这用于测试和调试。为了使控件可重用,我将自定义数据集视为普通的System.Data.DataSet。

我已经扩展了控件,允许将数据集保存到XML文件中,也可以加载以前保存的XML文件。

我现在要做的是将加载的数据文件作为标准数据集处理,并将其转换回自定义数据集。这应该不难,但我得到了以下系统。InvalidCastException信息:

无法强制转换"System.Data"类型的对象。数据集的类型"CostingDataSet"。

下面是问题代码的示例(它是生成异常的3的最后一行):

DataSet selected = debugDisplay.SelectedDataSet;
CostingDataSet tempDS = new CostingDataSet();
tempDS = (CostingDataSet)selected.Copy();

谁能给我指点一下如何解决这个问题?

编辑:

根据nEM的意见,我实现了这个,一切都很好。

foreach (System.Data.DataTable basicDT in selected.Tables)
{
    DataTable dt = tempDS.Tables[basicDT.TableName];
    dt = basicDT.Copy();
}

此外,SSarma建议的代码也可以使用

如何序列化/反序列化自定义数据集

从我从这个网站收集到的信息来看,你不能将一个常规的数据集转换成一个有意义的类型数据集,因为它是强类型的,并且有一定的规范。如果您将它保存为常规数据集,那么当您对它进行反序列化时,XML就不会记得它曾经被创建为类型化数据集。对于xml文件,您只保存了一个常规数据集,因此它相当于试图通过显式强制转换将标准数据集转换为类型化数据集,这是不允许的。

您可以创建一个填充方法,该方法将常规数据集作为参数复制所有数据到您的类型化数据集。

这是假设您将其序列化为标准数据集。

如何使用流(对不起,下面的代码没有测试),但你得到的想法

 DataSet selected = debugDisplay.SelectedDataSet;
  string ds1 = selected.GetXml();
  CostingDataSet tempDS = new CostingDataSet();
  System.IO.MemoryStream ms = new System.IO.MemoryStream(ds1.Length);
  selected.WriteXml(ms);
  ms.Position = 0;
  tempDS.ReadXml(ms);