.net Can';t序列化作为数据集一部分的DataTable
我有一个数据集,里面有一些数据表。我可以成功地对数据集进行二进制序列化 如果我尝试分别序列化其中一个数据表,我会得到一个NullReferenceException 如果我制作了DataTable的副本,那么副本可以序列化 有人知道我做错了什么吗 该代码再现了该问题:.net Can';t序列化作为数据集一部分的DataTable,.net,.net,我有一个数据集,里面有一些数据表。我可以成功地对数据集进行二进制序列化 如果我尝试分别序列化其中一个数据表,我会得到一个NullReferenceException 如果我制作了DataTable的副本,那么副本可以序列化 有人知道我做错了什么吗 该代码再现了该问题: internal class Program { private static void Main(string[] args) { System.String xml =
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
XYZ888123456DATA2012-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中,这些数据行在处理期间被清除XmlDataTreeWriter
在this.rowsOrder[row].ToString()上失败,并抛出NullReferenceException
- 序列化整个数据集
- 清除
dt0.ChildRelations
- 序列化副本
dt0.ChildRelations.Clear()
,但是您可以只调用Copy()
。请注意,如果复制一个数据表
所有关系也将被删除;在我的情况下,我可以删除这些。非常感谢你!