ASN.1 - это стандарт ISO / ISE. Он имеет очень читаемый исходный язык и множество бэкэндов, как двоичных, так и удобочитаемых. Исходный язык является международным стандартом (и к тому же старым!), Исходный язык немного неаккуратен (примерно так же, как Атлантический океан немного влажный), но он очень хорошо определен и имеет приличную поддержку. , (Вероятно, вы можете найти библиотеку ASN.1 для любого языка, который вы называете, если вы достаточно усердно копаете, а если нет, есть хорошие библиотеки языка C, которые вы можете использовать в FFI.) Это стандартизованный язык, одержимо документированный и также есть несколько хороших руководств.
Экономия - это не стандарт. Первоначально он был создан Facebook, позже был открыт с открытым исходным кодом и в настоящее время является проектом Apache верхнего уровня. Это плохо документировано - особенно уровни обучения - и, на мой (правда, краткий) взгляд, кажется, не добавляет ничего, чего не делали другие, предыдущие усилия (а в некоторых случаях и лучше). Честно говоря, он имеет довольно внушительное количество языков, которые он поддерживает из коробки, включая несколько высокопрофильных, неосновных. IDL также отдаленно похож на C.
Буферы протокола не являются стандартом. Это продукт Google, доступный широкому сообществу. Он немного ограничен с точки зрения языков, поддерживаемых из коробки (он поддерживает только C ++, Python и Java), но у него есть много сторонней поддержки для других языков (с очень переменным качеством). Google выполняет практически всю свою работу, используя буферы протоколов, так что это проверенный в боевых условиях протокол (хотя и не такой боевой, как ASN.1. Документация у него гораздо лучше, чем у Thrift, но, будучи Продукт Google, скорее всего, будет нестабильным (в смысле постоянно меняющегося, а не в смысле ненадежного). IDL также похож на C.
Все вышеперечисленные системы используют схему, определенную в некотором виде IDL, для генерации кода для целевого языка, который затем используется при кодировании и декодировании. Авро нет. Типизация Avro является динамической, и ее данные схемы используются непосредственно во время выполнения как для кодирования, так и для декодирования (что имеет некоторые очевидные затраты на обработку, но также имеет некоторые очевидные преимущества по сравнению с динамическими языками и отсутствие необходимости в типах тегов и т. Д.) , В его схеме используется JSON, что упрощает управление поддержкой Avro на новом языке, если уже существует библиотека JSON. Опять же, как и большинство систем описания протоколов, заново изобретающих колесо, Avro также не стандартизирован.
Лично, несмотря на мои отношения любви / ненависти к нему, я бы, вероятно, использовал ASN.1 для большинства целей RPC и передачи сообщений, хотя на самом деле у него нет стека RPC (вам нужно было бы его создать, но IOC делают это достаточно просто).