ASN.1 - стандарт ISO / ISE. Він має дуже читану мову джерела та різноманітні зворотні сторони, як бінарні, так і людські. Будучи міжнародним стандартом (і старим у цьому!), Мова-джерело трохи кухонний (приблизно так само, як Атлантичний океан трохи мокрий), але він надзвичайно чітко визначений і має гідну кількість підтримки . (Напевно, ви можете знайти бібліотеку ASN.1 для будь-якої мови, яку ви назвете, якщо викопати досить важко, а якщо ні, то є хороші бібліотеки мови С, які ви можете використовувати у FFI.) Це, будучи стандартизованою мовою, нав'язливо документовано та також є кілька хороших навчальних посібників.
Ощадливість - це не стандарт. Він родом з Facebook, пізніше був відкритим і зараз є проектом Apache вищого рівня. Це недостатньо задокументовано - особливо рівні навчальних посібників - і на мій (правда кажучи, короткий) погляд, здається, не додає нічого іншого, що попередні зусилля вже не роблять (а в деяких випадках і краще). Справедливості до цього, у нього є досить вражаюча кількість мов, які він підтримує нестандартно, включаючи декілька непрофільних мов. IDL також невиразно схожий на С.
Буферні протоколи - це не стандарт. Це продукт Google, який випускається для широкої спільноти. Він дещо обмежений з точки зору мов, які підтримуються поза коробкою (він підтримує лише C ++, Python та Java), але у нього є багато сторонньої підтримки для інших мов (дуже різної якості). Google виконує майже всю свою роботу, використовуючи буфери протоколів, тому це протокол, перевірений боєм, захищений від бою (хоч і не такий загартований у бою, як ASN.1. Він має набагато кращу документацію, ніж бережливість, але, будучи Продукт Google, він, ймовірно, нестабільний (у сенсі постійно змінюється, а не в сенсі ненадійного). ІДЛ також схожий на С.
Усі перераховані вище системи використовують схему, визначену в якомусь вигляді IDL, щоб генерувати код для цільової мови, який потім використовується при кодуванні та декодуванні. Авро ні. Типізація Avro є динамічною, і її схематичні дані використовуються під час виконання безпосередньо як для кодування, так і для декодування (що має деякі очевидні витрати на обробку, але також і деякі очевидні переваги щодо динамічних мов та відсутність потреби в маркуванні типів тощо). . Його схема використовує JSON, що робить підтримку Avro новою мовою трохи простішою в управлінні, якщо вже є бібліотека JSON. Знову ж таки, як і у більшості систем опису протоколів на винаході колеса, Avro також не стандартизований.
Особисто, незважаючи на мої стосунки з коханням / ненавистю до нього, я, мабуть, використовував ASN.1 для більшості цілей RPC та передачі повідомлень, хоча він насправді не має стеку RPC (вам доведеться зробити його, але МОК зробити це досить простий).