如何提高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秒太多了:(我认为,主要原因可能是我的实体对象的序列化……但如何加快速度?

如何提高wcf服务的序列化速度

尝试使用DTO模式。只发送那些需要的字段

由于您使用的是byte[],因此您似乎可以完全控制-在这种情况下,我建议尝试使用protobuf-net作为序列化程序。这使用的CPU要少得多,而且通常带宽也要少得多。

如果dta由字符串(描述中的文本段落等)主导,那么你也可以在混合中添加一些GZipStream/DeflateStream(正如你已经展示的那样),以减少更多字节的带宽。

从POCO切换到protobuf网络通常非常容易。


如果您所说的数据集是指DataSet/DataTable,那么启用内部二进制序列化将有所帮助(默认情况下,它使用XML,甚至通过BinaryFormatter)。如果是,请将RemotingFormat属性更改为二进制。