如何提高wcf服务的序列化速度
本文关键字:序列化 速度 服务 何提高 wcf | 更新日期: 2023-09-27 18:19:34
再次提出关于wcf服务压缩的问题。我正在使用netnamedpipe绑定将一些实体对象发送到我的调用应用程序。我知道,这是个坏主意,但这正是我的客户希望实现它的方式。
所以现在,我必须通过netnamedpipe发送大约45000个数据集(实体对象)。真的很慢。我实现了一个类,它将数据对象压缩为byte[],但45000个集仍需要大约45秒才能发送/接收。
我是这样压缩的:
public static byte[] Compress<T>(T data)
{
byte[] result = null;
using (var memory = new MemoryStream())
{
using (var zip = new DeflateStream(memory, CompressionMode.Compress, true))
{
var formatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
formatter.Serialize(zip, data);
}
result = memory.ToArray();
}
return result;
}
有没有办法改善这一点?45秒太多了:(我认为,主要原因可能是我的实体对象的序列化……但如何加快速度?
尝试使用DTO模式。只发送那些需要的字段
由于您使用的是byte[],因此您似乎可以完全控制-在这种情况下,我建议尝试使用protobuf-net作为序列化程序。这使用的CPU要少得多,而且通常带宽也要少得多。
如果dta由字符串(描述中的文本段落等)主导,那么你也可以在混合中添加一些GZipStream/DeflateStream(正如你已经展示的那样),以减少更多字节的带宽。
从POCO切换到protobuf网络通常非常容易。
如果您所说的数据集是指DataSet/DataTable,那么启用内部二进制序列化将有所帮助(默认情况下,它使用XML,甚至通过BinaryFormatter)。如果是,请将RemotingFormat属性更改为二进制。