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

发布于 2024-12-25 04:32:18 字数 756 浏览 3 评论 0原文

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

Again a question about compression on wcf services.
I'm using netnamedpipe binding to send some entity objects to my calling application.
I know, that's a bad idea, but that's the way my customer wants it to be implemented.

So right now, I have to send about 45000 datasets (entity objects) via netnamedpipe.
That's really really slow. I've implemented a class which compresses the data objects to
byte[] before sending, but 45000 sets are still taking 'bout 45 seconds to send/receive.

I'm compressing like this:

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;
}

Is there a way to improve that? 45 seconds are too much :( I think, main reason could be serialization of my entity objects.. but how to speed that up?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

未蓝澄海的烟 2025-01-01 04:32:18

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

try using DTO pattern. Send only those fields which are required

浅紫色的梦幻 2025-01-01 04:32:18

由于您使用的是 byte[] ,所以您似乎拥有完全的控制权 - 在这种情况下,我建议尝试 protobuf-net 作为序列化器。这会使用相当少的 CPU,并且通常也会显着减少带宽。

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

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


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

Since you are using byte[] it seems you have full control - in which case I would recommend trying protobuf-net as the serializer. This uses considerably less CPU, and usually considerably less bandwidth too.

If you dta is dominated by strings (paragraphs of text in descriptions etc) then you could also add some GZipStream/DeflateStream into the mix (as you already show), to chip off a few more bytes bandwidth.

Switching to protobuf-net from a POCO is usually pretty easy.


If by data set you mean DataSet/DataTable, then enabling the internal binary serialization will help (it uses XML by default, even via BinaryFormatter). If so, change the RemotingFormat property to binary.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文