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

3
我有一个WinForms应用程序,使用强类型自定义DataSet来保存处理数据。它从数据库中获取数据并填充到DataSet中。
我有一个用户控件,可以将任何自定义dataset中的内容显示在数据网格中,这用于测试和调试。为了使控件可重用,我将自定义dataset视为普通的System.Data.DataSet。
我扩展了该控件,使其能够保存dataset到XML文件中,并加载以前保存的XML文件。
现在我想做的是将已加载的数据文件(被视为标准DataSet)转换回自定义Dataset。这不应该很困难,但我得到了以下System.InvalidCastException消息:
无法将类型为“System.Data.DataSet”的对象强制转换为类型“CostingDataSet”。
以下是问题代码示例(最后一行会生成异常):
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提供的代码也可以运行。

我认为对于自定义对象,您需要在自定义对象类上使用可序列化属性...并提供序列化和反序列化构造函数。您这样做了吗? - nbz
你看过这个链接吗?http://msdn.microsoft.com/en-us/library/ms233843.aspx - nbz
@nEM 我使用了自定义工具“MSDATASETGENERATOR”来创建数据集的代码,并且这是可序列化的。在自定义数据集传递给我的控件之前,它会被转换为标准的DataSet以供显示。 - TeamWild
实际上,我认为标准的 DataSet 不能转换为强类型的 DataSet。你可能需要一个类来重新填充它。 - nbz
2个回答

5
根据这个网站所述,您不能将普通数据集强制转换为已分类的数据集,这是有道理的,因为它是强类型的并具有某些规格。如果您将其保存为常规数据集,则在反序列化时,XML不会回忆起它曾经被创建为已分类的数据集。对于xml文件,您只保存了一个常规数据集,因此这相当于尝试通过显式转换将标准数据集转换为分类数据集,这是不允许的。

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

这假定您正在将其序列化为标准数据集。


这非常有道理。谢谢。我会进一步调查。 - TeamWild

4
如何使用流(抱歉,以下代码未经测试),但您可以理解。
 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);

是的,那个方法有效,尽管我想到了一个稍微不同的方法,通过迭代数据集中的表并加载每个表。 - TeamWild

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接