4

いくつかのDataTableを含むDataSetがあります。DataSetを正常にバイナリシリアル化できます。

DataTableの1つを個別にシリアル化しようとすると、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と呼びます。

デシリアライズされたデータセットには2つのテーブルがCRありdata、それらの間には関係があります。ケースBの場合、内部はテーブルに関する情報を失います(より正確にはdataコレクション)。rowsOrder

失敗のシーケンス:

  1. 内部クラスNewDiffgramGenは、次の行の順序を維持します。
    • データセット内のすべてのテーブル(ケースA)
    • 1つの提供されたテーブル(ケースB)
    • 1つの提供されたテーブル(ケースC)
  2. 内部クラスXmlDataTreeWriterは、子関係を介してDataRowsを再帰的にシリアル化します。これらは、ケースCの対処中にクリアされます。
  3. BXmlDataTreeWriterが失敗しthis.rowsOrder[row].ToString()てスローした場合NullReferenceException

したがって、3つのオプションがあります。

  • データセット全体をシリアル化する
  • クリアdt0.ChildRelations
  • コピーをシリアル化する
于 2013-03-26T16:38:03.920 に答える
-2

dt0.Copy()とまったく同じオブジェクトをコピーしませんdt0。コードをデバッグしましたが、copyオブジェクトにインスタンスが含まれていませんDataSet。したがって、オブジェクトをシリアル化する必要がある場合はDataTable、おそらくコピーをシリアル化するのが最善のオプションです。

于 2013-03-26T15:34:24.293 に答える