Как улучшить скорость сериализации на сервисе wcf?

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

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

Решение

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

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

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

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


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

Другие вопросы по тегам