无法序列化DataTable,它是DataSet的一部分

时间:2013-03-26 14:54:33

标签: .net

我有一个带有一些DataTables的DataSet。我可以成功地二进制序列化DataSet。

如果我尝试单独序列化其中一个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);
        }
    }
}

2 个答案:

答案 0 :(得分:2)

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

您的反序列化数据集有两个表CRdata,它们之间有关系。在案例B中,内部会丢失一些关于data表的信息(集合rowsOrder更准确)。

失败的顺序:

  1. 内部类NewDiffgramGen维护行顺序:
    • 数据集中的所有表格(案例A)
    • 一个提供的表格(案例B)
    • 一个提供的表格(案例C)
  2. 内部类XmlDataTreeWriter通过子关系递归地序列化DataRows,这些在C的情况下在应对期间被清除
  3. 以防B XmlDataTreeWriterthis.rowsOrder[row].ToString()失败并抛出NullReferenceException
  4. 所以你有三个选择:

    • 序列化整个数据集
    • 清除dt0.ChildRelations
    • 序列化副本

答案 1 :(得分:-2)

dt0.Copy()不会复制与dt0完全相同的对象。我调试了您的代码,copy对象不包含DataSet实例。因此,如果您需要序列化DataTable对象,可能序列化副本是最佳选择。