У меня есть API, который требует, чтобы поля объекта были отсортированы в алфавитном порядке, потому что структура должна быть хеширована.
В Java / Jackson вы можете установить флаг в сериализаторе: MapperFeature.SORT_PROPERTIES_ALPHABETICALLY
. Ничего подобного в Серде не найду.
Я использую rmp-serde
(MessagePack). Он следует за аннотациями и процессом сериализации, используемым для JSON, поэтому я подумал, что он будет полностью совместим, но сортировка, предоставляемая @jonasbb, для этого не работает.
Структура имеет (много) вложенных перечислений и структур, которые необходимо выровнять для окончательного представления. Я использую для этого Serialize::serialize
, но вызов state.serialize_field
в нужном месте (чтобы все было в алфавитном порядке) - это боль, потому что перечислениям требуется предложение match
, поэтому его нужно вызывать несколько раз для одного и того же поля в разных местах и код очень труден для понимания.
В качестве возможных решений две идеи:
Создайте новую структуру с плоским представлением и отсортируйте поля в алфавитном порядке вручную.
Это немного подвержено ошибкам, поэтому решение программной сортировки для этой уплощенной структуры было бы отличным.
Сохраните ключевые значения в
Serialize::serialize
(например, вBTreeMap
, который отсортирован) и вызовитеstate.serialize_field
в цикле в конце.Проблема в том, что значения, похоже, должны быть типа
Serialize
, что небезопасно для объектов, поэтому я не смог понять, как сохранить их на карте.
Как отсортировать ключи HashMap при сериализации с помощью serde? аналогичен, но не связан, потому что мой вопрос касается сортировки полей структуры /характеристики.