如何序列化/反序列化自定义DataSet

时间:2011-10-25 15:07:56

标签: c# serialization deserialization strongly-typed-dataset

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

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

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

我现在要做的是获取加载的数据文件,该文件被视为标准DataSet,并将其强制转换回自定义数据集。这应该不难,但我得到以下System.InvalidCastException消息:

  

无法将类型为“System.Data.DataSet”的对象强制转换为类型   '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建议的代码也有效。

2 个答案:

答案 0 :(得分:5)

根据我从this website收集的内容,您无法将常规数据集转换为有类型的数据集,因为它的类型很强且具有一定的规格。如果您将其保存为常规数据集,则在对其进行反序列化时,XML不会记录它作为类型化数据集创建的情况。对于xml文件,您只保存了常规数据集,因此它等同于尝试通过显式转换将标准数据集转换为类型化数据集,这是不允许的。

您可以创建一个populate方法,该方法将常规数据集作为参数,将所有数据复制到您键入的数据集中。

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

答案 1 :(得分:4)

如何使用Streams(对不起代码未经过测试),但您明白了

 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);