Что: 6ad3f718465aa49b19e0db96dc48878aed60fac6
Когда: 2021-03-20 11:44:49+03:00
Темы: c
Поработал с 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-а и решающего какой дальше запускать десериализатор.
Сгенерирован: SGBlog 0.34.0