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

时间:2012-01-06 15:41:41

标签: c# wcf compression entity netnamedpipebinding

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

2 个答案:

答案 0 :(得分:1)

尝试使用DTO模式。仅发送所需的字段

答案 1 :(得分:1)

由于您正在使用byte [],因此您似乎可以完全控制 - 在这种情况下,我建议您尝试使用protobuf-net作为序列化程序。这使用了相当少的CPU,并且通常也显着减少了带宽。

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

从POCO切换到protobuf-net通常非常简单。


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