Как улучшить скорость сериализации на сервисе 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 на двоичное.