第二种方式

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

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; View Code

序列化的长度分别从上到下是: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的序列化。对于类的序列化性能几乎能达到第三种方式工具类的水平,也是很优质的。