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