From: Sergey Matveev Date: Sat, 20 Mar 2021 08:44:49 +0000 (+0300) Subject: Поработал с XDR в Си X-Git-Url: http://www.git.stargrave.org/?a=commitdiff_plain;h=6ad3f718465aa49b19e0db96dc48878aed60fac6;p=stargrave-blog.git Поработал с 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-а и решающего какой дальше запускать десериализатор. ---