将DataTable序列化为的byte数组(转换为字节数组)
第一种方式
System.IO.MemoryStream memory2 = new MemoryStream();//使用内存流来存这些byte[]
BinaryFormatter b = new BinaryFormatter();
b.Serialize(memory2, table);
byte[] temp2 = memory2.ToArray();
//反序列化
DataTable dt1 = (DataTable)b.Deserialize(new MemoryStream(temp2)); //dt1是byte[]转回的datatable
第二种方式
MemoryStream memory = new MemoryStream();
System.Xml.XmlTextWriter xtw = new System.Xml.XmlTextWriter(memory, System.Text.Encoding.UTF8);
table.WriteXml(memory,XmlWriteMode.WriteSchema);
byte[] temp = memory.ToArray();
//反序列化
DataTable ds = new DataTable();
System.Xml.XmlTextReader xtr= new System.Xml.XmlTextReader(new MemoryStream(temp));
ds.ReadXml(xtr); //dt1是byte[]转回的datatable
第三种方式
https://gitee.com/kevin2y/KnBinarySerializer
byte[] buffer = KnBinarySerializer.BianaySerializer.Serialize(table);
var compare = KnBinarySerializer.BianaySerializer.DeSerialize<DataTable>(buffer);
序列化的datatable很简单的三列十行数据。
static DataTable buildTable(string name) { DataTable table = new DataTable(); table.TableName = name; table.Columns.Add("Name", typeof(string)); table.Columns.Add("Sex", typeof(string)); table.Columns.Add("Age", typeof(int)); for (int i = 0; i < 10; i++) { DataRow dataRow = table.NewRow(); dataRow["Name"] = name + i; dataRow["Sex"] = "ll"; dataRow["Age"] = i; table.Rows.Add(dataRow); } table.AcceptChanges(); return table; }
序列化的长度分别从上到下是:2637、1698、278。是的你没有看错,将DataTable转为xml再转为byte数组是比直接进行二进制转换更省空间。第三种就真的极简的一种序列化形式了。
我们再来看三者的速度比拼。进行一次序列化、一次反序列化视为一次过程。比10万次过程三者总用时。结果如下
第一种: 27027.73毫秒
第二种:20382.15毫秒
第三种: 4060.89毫秒
其实上面的转换都支持对类进行序列化,下面还有一个性能不错的序列化工具
https://gitee.com/dotnetchina/RRQMSocket
ByteBlock byteBlock = BytePool.GetByteBlock(1024 * 100);
RRQMCore.Serialization.SerializeConvert.RRQMBinarySerialize(byteBlock, student);
但不支持对DataTable的序列化。对于类的序列化性能几乎能达到第三种方式工具类的水平,也是很优质的。