我正在从 WCF 操作返回一个自定义类。使用的绑定是netTcp。该自定义类包含多个数据成员。其中之一是数据集。根据特定操作,数据集可能会很大。我计划将数据集压缩为字节,然后返回自定义类。
根据阅读,我想出了以下代码来从数据集中返回压缩字节。但不确定这是否是最好的方法(或正确的方法)。你的想法请。 ??
byte[] bytes = null;
byte[] compressedBytes = null;
using(var memory = new MemoryStream())
{
var formatter = new BinaryFormatter();
formatter.Serialize(memory, ds);
bytes = memory.ToArray();
}
using(var memory = new MemoryStream())
{
using(var gzip = new GZipStream(memory, CompressionMode.Compress, true))
{
gzip.Write(bytes, 0, bytes.Length);
compressedBytes = memory.ToArray();
}
}
return compressedBytes;
节省空间有一个重要的步骤:
ds.RemotingFormat = SerializationFormat.Binary;
否则它内部使用 xml,即使通过BinaryFormatter
。完成此操作后,您还可以包含 gzip,但效果并不好quite一样重要。碰巧我有一些统计数据可以比较here;将该数据复制到:
DataTable (xml) (vanilla) 2269ms/6039ms
64,150,771 bytes
DataTable (xml) (gzip) 4881ms/6714ms
7,136,821 bytes
DataTable (xml) (deflate) 4475ms/6351ms
7,136,803 bytes
BinaryFormatter (rf:binary) (vanilla) 2006ms/3366ms
11,272,592 bytes
BinaryFormatter (rf:binary) (gzip) 3332ms/4267ms
8,265,057 bytes
BinaryFormatter (rf:binary) (deflate) 3216ms/4130ms
But: DataSet
is not一种非常 WCF 的做事方式。我会添加标准的 OO 类,并且将序列化器替换为 protobuf-net 之类的东西,即明显较小比任何一个DataContractSerializer
or NetDataContractSerializer
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)