我有一个带有一些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);
}
}
}
答案 0 :(得分:2)
IMO这是一个错误。我将序列化数据集称为案例A,数据表作为案例B并复制数据表案例C
您的反序列化数据集有两个表CR
和data
,它们之间有关系。在案例B中,内部会丢失一些关于data
表的信息(集合rowsOrder
更准确)。
失败的顺序:
NewDiffgramGen
维护行顺序:
XmlDataTreeWriter
通过子关系递归地序列化DataRows,这些在C的情况下在应对期间被清除XmlDataTreeWriter
在this.rowsOrder[row].ToString()
失败并抛出NullReferenceException
所以你有三个选择:
dt0.ChildRelations
答案 1 :(得分:-2)
dt0.Copy()
不会复制与dt0
完全相同的对象。我调试了您的代码,copy
对象不包含DataSet
实例。因此,如果您需要序列化DataTable
对象,可能序列化副本是最佳选择。