Какой самый быстрый метод сериализации для .NET? - PullRequest
2 голосов
/ 13 ноября 2009

Я пытаюсь сериализовать данные размером около 30 КБ, и мне нужно найти более быстрый способ сериализации и десериализации данных. Для меня скорость так же важна, как и размер, поэтому я либо найду способ более плотно сжать данные, либо мне нужен более быстрый механизм для создания объектов. Я пытался создать некоторые собственные методы для него, а также использовать встроенные методы сериализации, но я надеюсь, что кто-то там имеет некоторый опыт в этом.

В моем приложении миллисекунды имеют значение, поэтому скорость в сравнении с размером хорошая, особенно если некоторые объекты могут быть довольно большими.

EDIT

Данные - это объект с многочисленными свойствами, включая словарь и несколько целых и строковых полей. Предположим, сложная сетка.

Итак, я сделал это для примера, который дает вам представление о том, как могут выглядеть отношения в объекте.

<Serializable()> Class A
    Inherits B
    Dim _C As New C
    Dim E As Byte()
End Class
<Serializable()> Class B
    Dim A As Int32
    Dim B As Dictionary(Of String, Object)
End Class
<Serializable()> Class C
    Dim A As Int32
    Dim D As String
End Class

Конечно, есть также средства доступа к полям, но это не должно влиять на это.

Ответы [ 3 ]

2 голосов
/ 13 ноября 2009

На ум приходит несколько вещей.

Можно ли уменьшить количество сериализуемых данных? Это может быть тупиком для вас, но, очевидно, это сильно повлияет на производительность.

Можете ли вы уменьшить общую задержку за счет потоковой передачи сериализованных данных? Если целью сериализованного графа объектов является сетевой поток, файл и т. Д., То вы можете перекрыть две или более операций и уменьшить общую задержку.

Можете ли вы уменьшить общность структуры, чтобы настраиваемая сериализация охватывала больше случаев? Я смотрю на B :: B и что он может тянуть любой тип через значение словаря. Может случиться так, что фактические типы, помещенные в этот Словарь, полностью находятся под вашим контролем, но это стоит упомянуть, потому что, как правило, более простые и более управляемые структуры данных проще и быстрее сериализировать.

Есть ли избыточность в данных, которые вы можете использовать? Если вы знали, что некоторые из объектов, содержащихся в словаре, были функционально эквивалентны, то вы могли бы сериализовать их как группу и просто ссылаться на них по индексу при сериализации словаря.

Кроме того, не стоит недооценивать влияние размера на производительность. Опять же, это зависит от того, что программа делает со структурой, но даже создание большого потока байтов само по себе может повлечь за собой временные затраты. Конечно, отправка большего количества байтов по сети или в файл также занимает больше времени.

Я бы предположил, что написание минимального пользовательского кода сериализации для классов приведет к чистому улучшению по сравнению с сериализацией по умолчанию во время выполнения, даже если только потому, что вам не нужно записывать так много метаданных. Строительство детей-членов тоже должно быть быстрее.

Другой метод (который может или не может помочь здесь) - сделать вашу структуру данных лучше связанной для сериализации. Например, если у вас была древовидная структура, сохраняйте ссылки «брат-брат» в дополнение к ссылкам «родитель-потомок», чтобы можно было перечислять их все по порядку без затрат на рекурсивную обработку дерева. Куча тоже приходит на ум. Вы можете перебирать элементы в куче, независимо от того, как элементы индивидуально связаны друг с другом.

0 голосов
/ 13 ноября 2009

В посте есть интересный тест protobuf-net против NetDataContractSerializer в блоге Марка Гравелла.

В любом случае, вам нужно предоставить более подробную информацию о структуре ваших данных, если вы хотите получить полезный ответ.

0 голосов
/ 13 ноября 2009

Ответ радикально зависит от вида и структуры сериализуемых данных.

Если данные представляют собой массив байтов 30 КБ, запишите все это в двоичный поток как один блок, он не может получить намного быстрее, чем это.

Если данные представляют собой 30K-сетку высокоструктурированных объектов, встроенных в сетку взаимосвязей ... - удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...