4

我有一个包含一些数据表的数据集。我可以成功二进制序列化数据集。

如果我尝试单独序列化其中一个 DataTable,我会得到 NullReferenceException。

如果我制作 DataTable 的副本,则该副本可以很好地序列化。

有人知道我在做什么错吗?

此代码重现了该问题:

internal class Program
{
    private static void Main(string[] args)
    {
        System.String xml =
            "<CR><AN>543</AN><Br>XYZ</Br><Id>888</Id><M>123456</M><EVT>DATA</EVT><data><telephony><S>2012-01-11T14:01:54.9571247Z</S><CID>100000</CID><reason>test</reason></telephony></data></CR>";

        var ds = new System.Data.DataSet();
        using (var stringReader = new System.IO.StringReader(xml))
        {
            ds.ReadXml(stringReader);
        }

        //This works.
        var serializer = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
        using (var memStream = new System.IO.MemoryStream())
        {
            serializer.Serialize(memStream, ds);
        }

        System.Data.DataTable dt0 = ds.Tables[0];

        //Serializing a copy works
        System.Data.DataTable copy = dt0.Copy();
        using (var memStream = new System.IO.MemoryStream())
        {
            serializer.Serialize(memStream, copy);
        }

        //Serializing the original fails with a NULL Reference Exception
        using (var memStream = new System.IO.MemoryStream())
        {
            serializer.Serialize(memStream, dt0);
        }
    }
}
4

2 回答 2

2

IMO 这是一个错误。我将序列化数据集称为案例 A,数据表称为案例 B,复制数据表案例 C

您的反序列化数据集有两个表CR,并且data它们之间存在关系。在情况 B 中,内部会丢失一些有关data表的信息(rowsOrder更准确地说是集合)。

失败顺序:

  1. 内部类NewDiffgramGen维护行顺序:
    • 数据集中的所有表(案例 A)
    • 一张提供的桌子(案例B)
    • 一张提供的桌子(案例C)
  2. 内部类XmlDataTreeWriter通过子关系递归地序列化DataRows,这些在应对过程中被清除,以防C
  3. 万一BXmlDataTreeWriter失败this.rowsOrder[row].ToString()并抛出NullReferenceException

所以你有三个选择:

  • 序列化整个数据集
  • 清除dt0.ChildRelations
  • 序列化副本
于 2013-03-26T16:38:03.920 回答
-2

dt0.Copy()不会复制与dt0. 我调试了您的代码,并且该copy对象不包含DataSet实例。所以,如果你需要序列化DataTable对象,可能序列化副本是最好的选择。

于 2013-03-26T15:34:24.293 回答