1

又是一个关于 wcf 服务压缩的问题。我正在使用 netnamedpipe 绑定将一些实体对象发送到我的调用应用程序。我知道,这是一个坏主意,但这是我的客户希望它实施的方式。

所以现在,我必须通过 netnamedpipe 发送大约 45000 个数据集(实体对象)。这真的很慢。我已经实现了一个类,它在发送之前将数据对象压缩为字节 [],但是 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秒太多了:(我认为,主要原因可能是我的实体对象的序列化..但是如何加快速度?

4

2 回答 2

1

尝试使用 DTO 模式。仅发送那些必填字段

于 2012-01-06T15:44:49.543 回答
1

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

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

从 POCO 切换到 protobuf-net 通常非常容易。


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

于 2012-01-06T16:26:26.847 回答