Сериализация BinaryFormatter в разное время для разных классов ⇐ C#
Сериализация BinaryFormatter в разное время для разных классов
Я использую BinaryFormatter для отправки различных типов сообщений через TCP.
Я использую следующий код для передачи производного класса MessageBase:
private void TransmittingThread() { log.Debug("TCPCommunicationLayer - Запуск TransmittingThread"); пока (IsRunning) { пытаться { // Это блокируется до тех пор, пока сообщение не станет доступным MessageBase msg = MessageQueue.Take(); если (сообщение != ноль) { Секундомер stopWatch = новый секундомер(); стопВатч.Старт(); BinaryFormatter f = новый BinaryFormatter(); MemoryStream мс = новый MemoryStream(); f.Serialize(мс, сообщение); длинный msgSize = ms.Length; log.Debug($"Передача - {msg.Report(true)} - {msgSize} Байт - {stopWatch.ElapsedMilliсекунды} мс"); f.Serialize(_client.GetStream(), msg); стопВатч.Стоп(); log.Debug($"Передано - {msg.Report(true)} - {stopWatch.ElapsedMilliсекунды} мс"); мс.Закрыть(); } } поймать (Исключение e) { журнал.Ошибка(е); Отключить(); } } while (MessageQueue.TryTake(out _)) { } log.Debug("TCPCommunicationLayer - Выход из TransmittingThread"); } MessageBase определяется как:
[Сериализуемый] публичный абстрактный класс MessageBase { защищенная база сообщений (имя строки) { Имя = имя; Guid = Guid.NewGuid(); } общедоступное руководство Guid { get; } общедоступная строка Имя {get; } } [Сериализуемый] открытый класс ParameterMessage: MessageBase { общедоступное параметрическое сообщение (имя строки, данные T) : база (имя) { Данные = данные; } общественные данные T {получить; } } Передача следующего класса размером около 5 МБ занимает около 500 мс:
[Сериализуемый] общедоступный класс SharedPreview: SharedPreviewParameters { частный байт[] _previewImageBuffer = Array.Empty(); частный байт[] _labelImageBuffer = Array.Empty(); public SharedPreview (ScanInfo scanInfo, List RegionsOfInterest, List PredictiveFocusPoints) : base(scanInfo, RegionOfInterest, PredictiveFocusPoints) { } частный байт [] EncodeImage (изображение растрового изображения) { // ... } частный BitmapImage ExtractImage (буфер байта []) { // ... } } Но следующий класс размером всего 200 Кб занимает около 20 секунд:
[Сериализуемый] открытый класс ClientLogDefinition { общедоступная строка Имя файла {get; набор; } общественная строка FullPath {получить; набор; } общедоступная строка Content {get; набор; } } [Сериализуемый] общедоступный класс SharedClientLogs { общественный список ClientLogs {get; } = новый список(); } Я понимаю, что мог бы преобразовать строки в массивы байтов, что могло бы решить проблему, но мне бы очень хотелось знать, что вызывает очень низкую производительность при работе с большими строками
Я использую BinaryFormatter для отправки различных типов сообщений через TCP.
Я использую следующий код для передачи производного класса MessageBase:
private void TransmittingThread() { log.Debug("TCPCommunicationLayer - Запуск TransmittingThread"); пока (IsRunning) { пытаться { // Это блокируется до тех пор, пока сообщение не станет доступным MessageBase msg = MessageQueue.Take(); если (сообщение != ноль) { Секундомер stopWatch = новый секундомер(); стопВатч.Старт(); BinaryFormatter f = новый BinaryFormatter(); MemoryStream мс = новый MemoryStream(); f.Serialize(мс, сообщение); длинный msgSize = ms.Length; log.Debug($"Передача - {msg.Report(true)} - {msgSize} Байт - {stopWatch.ElapsedMilliсекунды} мс"); f.Serialize(_client.GetStream(), msg); стопВатч.Стоп(); log.Debug($"Передано - {msg.Report(true)} - {stopWatch.ElapsedMilliсекунды} мс"); мс.Закрыть(); } } поймать (Исключение e) { журнал.Ошибка(е); Отключить(); } } while (MessageQueue.TryTake(out _)) { } log.Debug("TCPCommunicationLayer - Выход из TransmittingThread"); } MessageBase определяется как:
[Сериализуемый] публичный абстрактный класс MessageBase { защищенная база сообщений (имя строки) { Имя = имя; Guid = Guid.NewGuid(); } общедоступное руководство Guid { get; } общедоступная строка Имя {get; } } [Сериализуемый] открытый класс ParameterMessage: MessageBase { общедоступное параметрическое сообщение (имя строки, данные T) : база (имя) { Данные = данные; } общественные данные T {получить; } } Передача следующего класса размером около 5 МБ занимает около 500 мс:
[Сериализуемый] общедоступный класс SharedPreview: SharedPreviewParameters { частный байт[] _previewImageBuffer = Array.Empty(); частный байт[] _labelImageBuffer = Array.Empty(); public SharedPreview (ScanInfo scanInfo, List RegionsOfInterest, List PredictiveFocusPoints) : base(scanInfo, RegionOfInterest, PredictiveFocusPoints) { } частный байт [] EncodeImage (изображение растрового изображения) { // ... } частный BitmapImage ExtractImage (буфер байта []) { // ... } } Но следующий класс размером всего 200 Кб занимает около 20 секунд:
[Сериализуемый] открытый класс ClientLogDefinition { общедоступная строка Имя файла {get; набор; } общественная строка FullPath {получить; набор; } общедоступная строка Content {get; набор; } } [Сериализуемый] общедоступный класс SharedClientLogs { общественный список ClientLogs {get; } = новый список(); } Я понимаю, что мог бы преобразовать строки в массивы байтов, что могло бы решить проблему, но мне бы очень хотелось знать, что вызывает очень низкую производительность при работе с большими строками
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение