На ум приходит несколько вещей.
Можно ли уменьшить количество сериализуемых данных? Это может быть тупиком для вас, но, очевидно, это сильно повлияет на производительность.
Можете ли вы уменьшить общую задержку за счет потоковой передачи сериализованных данных? Если целью сериализованного графа объектов является сетевой поток, файл и т. Д., То вы можете перекрыть две или более операций и уменьшить общую задержку.
Можете ли вы уменьшить общность структуры, чтобы настраиваемая сериализация охватывала больше случаев? Я смотрю на B :: B и что он может тянуть любой тип через значение словаря. Может случиться так, что фактические типы, помещенные в этот Словарь, полностью находятся под вашим контролем, но это стоит упомянуть, потому что, как правило, более простые и более управляемые структуры данных проще и быстрее сериализировать.
Есть ли избыточность в данных, которые вы можете использовать? Если вы знали, что некоторые из объектов, содержащихся в словаре, были функционально эквивалентны, то вы могли бы сериализовать их как группу и просто ссылаться на них по индексу при сериализации словаря.
Кроме того, не стоит недооценивать влияние размера на производительность. Опять же, это зависит от того, что программа делает со структурой, но даже создание большого потока байтов само по себе может повлечь за собой временные затраты. Конечно, отправка большего количества байтов по сети или в файл также занимает больше времени.
Я бы предположил, что написание минимального пользовательского кода сериализации для классов приведет к чистому улучшению по сравнению с сериализацией по умолчанию во время выполнения, даже если только потому, что вам не нужно записывать так много метаданных. Строительство детей-членов тоже должно быть быстрее.
Другой метод (который может или не может помочь здесь) - сделать вашу структуру данных лучше связанной для сериализации. Например, если у вас была древовидная структура, сохраняйте ссылки «брат-брат» в дополнение к ссылкам «родитель-потомок», чтобы можно было перечислять их все по порядку без затрат на рекурсивную обработку дерева. Куча тоже приходит на ум. Вы можете перебирать элементы в куче, независимо от того, как элементы индивидуально связаны друг с другом.