Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net Can';t序列化作为数据集一部分的DataTable_.net - Fatal编程技术网

.net Can';t序列化作为数据集一部分的DataTable

.net Can';t序列化作为数据集一部分的DataTable,.net,.net,我有一个数据集,里面有一些数据表。我可以成功地对数据集进行二进制序列化 如果我尝试分别序列化其中一个数据表,我会得到一个NullReferenceException 如果我制作了DataTable的副本,那么副本可以序列化 有人知道我做错了什么吗 该代码再现了该问题: internal class Program { private static void Main(string[] args) { System.String xml =

我有一个数据集,里面有一些数据表。我可以成功地对数据集进行二进制序列化

如果我尝试分别序列化其中一个数据表,我会得到一个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);
        }
    }
}
内部类程序
{
私有静态void Main(字符串[]args)
{
字符串xml=
“543
XYZ
888123456DATA2012-01-11T14:01:54.9571247Z100000test”; var ds=new System.Data.DataSet(); 使用(var stringReader=new System.IO.stringReader(xml)) { ReadXml(stringReader); } //这很有效。 var serializer=new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter(); 使用(var memStream=new System.IO.MemoryStream()) { serializer.Serialize(memStream,ds); } System.Data.DataTable dt0=ds.Tables[0]; //将副本序列化是可行的 System.Data.DataTable copy=dt0.copy(); 使用(var memStream=new System.IO.MemoryStream()) { serializer.Serialize(memStream,copy); } //序列化原始文件失败,出现空引用异常 使用(var memStream=new System.IO.MemoryStream()) { serializer.Serialize(memStream,dt0); } } }
dt0.Copy()
不会复制与
dt0
完全相同的对象。我调试了您的代码,并且
copy
对象不包含
DataSet
实例。因此,如果您需要序列化
DataTable
对象,那么序列化副本可能是最好的选择。

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

反序列化的数据集有两个表
CR
data
,它们之间有关系。在案例B中,内部会丢失一些有关
数据
表的信息(更准确地说,是收集
行排序器

失败顺序:

  • 内部类
    NewDiffgramGen
    维护以下行的顺序:
    • 数据集中的所有表(案例A)
    • 提供一张表格(案例B)
    • 提供一张表格(案例C)
  • 内部类
    XmlDataTreeWriter
    通过子关系递归序列化数据行,在案例C中,这些数据行在处理期间被清除
  • 如果B
    XmlDataTreeWriter
    this.rowsOrder[row].ToString()上失败,并抛出
    NullReferenceException
  • 所以你有三个选择:

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

    为什么要投否决票?dt0已附加到其数据集,而dt0.Copy()未附加。可能不允许使用附加的dataset序列化datatable,这就是异常的原因。(这就是我对@Agustin Meriles答案的理解)。所以问题是序列化一个与另一个数据表有关系的数据表,然后一次性序列化整个数据集。也许我们应该叫它虫子。解决此问题的另一种方法是调用
    dt0.ChildRelations.Clear()
    ,但是您可以只调用
    Copy()
    。请注意,如果复制一个
    数据表
    所有关系也将被删除;在我的情况下,我可以删除这些。非常感谢你!