Как улучшить скорость сериализации на сервисе wcf? - PullRequest
1 голос
/ 06 января 2012

Снова вопрос о сжатии на сервисах wcf. Я использую привязку netnamedpipe для отправки некоторых объектов сущности в мое вызывающее приложение. Я знаю, это плохая идея, но мой клиент хочет, чтобы это было реализовано.

Итак, сейчас я должен отправить около 45000 наборов данных (объектов сущностей) через netnamedpipe. Это действительно очень медленно. Я реализовал класс, который сжимает объекты данных в байт [] перед отправкой, но 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 ]

1 голос
/ 06 января 2012

Поскольку вы используете byte [], похоже, у вас есть полный контроль - в этом случае я бы рекомендовал попробовать protobuf-net в качестве сериализатора.При этом используется значительно меньше процессорного времени и, как правило, значительно меньшая пропускная способность.

Если в вашей dta преобладают строки (абзацы текста в описаниях и т. Д.), То вы также можете добавить в смесь немного GZipStream / DeflateStream (как вы уже сделали).покажите), чтобы скинуть еще несколько байтов пропускной способности.

Переключение на protobuf-net из POCO обычно довольно просто.


Если под набором данных вы подразумеваете DataSet / DataTable, то поможет включение внутренней двоичной сериализации (по умолчанию используется XML, даже через BinaryFormatter).Если это так, измените свойство RemotingFormat на двоичное.

1 голос
/ 06 января 2012

попробуйте использовать шаблон DTO.Отправляйте только те поля, которые обязательны для заполнения

...