[О блоге] [наверх] [пред] [2021-03-20 11:44:49+03:00] [6ad3f718465aa49b19e0db96dc48878aed60fac6]

Поработал с XDR в Си

https://en.wikipedia.org/wiki/External_Data_Representation
Про XDR уже не раз упоминал что он мне нравится как сериализатор.
(Очень) Простой, быстрый. XDR спецификации позволяют делать и union-ы с
массивами. Union -- аналог CHOICE-ов и OPTIONAL полей в ASN.1. В Си и
union и array поддерживаются на уровне удобных функций. Очень
понравилось что довольно тривиально можно одним махом, одним вызовом
распарсить структуру с union-ом и всякими массивами. И сериализовать
назад, точно таким же вызовом -- они все симметричны. Можно и с
файловыми дескрипторами работать напрямую сразу же, как в libnv
(793966ed64c5a6884e7f1a3d5491a7be4b3eea5f).

Вообще я потратил значительно больше времени на разбирательство как с
ним работать. С libnv через 5-10мин всё было сделано. Но libnv это как
JSON -- typeless хранение данных, не столько эффективное. А XDR это
исключительно типизированное представление. ASN.1 -- ни то, ни другое:
что-то можно будет распарить без спецификации, а что-то нет (ANY).

Ещё XDR понравился тем фактом, что в Free/Net/OpenBSD идёт из коробки (в
FreeBSD, как минимум, это в составе libc), как и в glibc тоже штатная
часть, с одинаковым интерфейсом (со времён Sun?). В Python из коробки
есть xdrlib, но которая не умеет автоматом union-ы парсить -- это уже
всё же более высокоуровневая штука: нужно просто самостоятельно писать
код вычитывающий значение enum-а и решающего какой дальше запускать
десериализатор.

    [оставить комментарий]