本人最近在写一个共享软件"鼎鼎条码批量打印系统2.0",其中要用到把一个DataSet写进二进制文件,下次再从二进制文件返回DataSet.思路是:把DataSet转换为Xml存到文件,下次打开时,把二进制文件转换为Xml,遇到问题和我的解决方法,希望和有缘的读者共飨……
1.DataSet.GetXml()
正常思维是把DataSet的数据取出,string xml = dataSet1.GetXml(),如果你的数据比较多,那么,GetXml()返回的并不是全部的数据,它长度有限制。这点搞得我好痛苦。
2.方法1未果,用DataSet.WriteXml()
如果想以后调用DataSet.ReadXml(),又不想出错或出现乱码,对于包含中文数据的,应注意输入文件的编码最好统一为:UTF8。保存为二进制时建议用
System.Text.Enconding.Default;
MemoryStream ms = new MemoryStream();
XmlWriter xw = new XmlTextWriter(ms, System.Text.Enconding.Default);
dataSet.WriteXml(xw,XmlWriteMode.Auto);
byte[] xmlBuffer = ms.GetBuffer();
//下面就可以写入二进制文件了
...
3.从二进制文件取回Xml注意事项
eg.
MemoryStream ms = new MemoryStream();
byte[] xmlBuffer = ...//读入二进制
ms.Write(xmlBuffer,0,xmlBuffer.Length); //写入流
dataSet.ReadXml(ms,XmlReadMode.Auto) // 这里很可能出错
上面原因是,从二进制文件读入时,由于字符串是以'/0'结束的,dataSet.ReadXml()它这个鸟东东并不会自动识别这一点,就会报错说找到不封闭的标签。
怎么办呢?目前我还没有在C#1.x上找到好方法直接在内存中转换,那么,这样试试……
string xml = System.Text.Encoding.Default.GetString(xmlBuffer); //以default编码取得字符串
xml = xml.TrimEnd('/0'); //这个重要
string tmp = Path.GetTempFile();//取得临时文件名
StreamWriter sw = new StreamWriter(tmp,FileMode.Create,FileAccess.Write,System.Text.Encoding.UTF8);
sw.Write(xml);
sw.Close();
dataSet.ReadXml(tmp,XmlReadMode.Auto); //成功读入
4.编后
这是由于Xml文件与二进行发生了关系才会这样,如果没涉及到二进制与文本的转换,那么你白看了。哈哈。
另外,上面代码全凭个人记忆打出,具体一些参数或许会有误,但主要是思想是吗??