将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;
}
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的序列化。对于类的序列化性能几乎能达到第三种方式工具类的水平,也是很优质的。

 

posted @ 2022-05-02 20:54  生命体验之kevin-Y  阅读(894)  评论(0编辑  收藏  举报