Язык определения протокола

Какое определение протокола вы рекомендуете? Я оценил буферы протокола Google, но он не позволяет мне контролировать размещение полей в формируемом пакете. Я предполагаю, что то же самое верно и для Thrift. Мои требования:

  1. указать расположение полей в пакете
  2. разрешить битовые поля
  3. условия: флаг (битовое поле) = true означает, что данные могут появиться в более позднем месте в пакете
  4. возможность определять структуру пакета, ссылаясь на определение другого пакета

Спасибо.

("Flavor" на SourceForge, используемый для определения MPEG-4, может быть кандидатом, но я ищу что-то, что, кажется, имеет больше сообщества и предпочтительно работает в среде .NET.)


person Mr. T.    schedule 21.01.2010    source источник


Ответы (3)


Меня интересуют причины ваших требований. Зачем нужно контролировать положение полей? Почему битовые поля важны? Условные?

Похоже, у вас есть (более или менее) фиксированный формат проводки, для которого вам нужно написать синтаксический анализатор, и в этом случае ни один из существующих популярных форматов протокола/сериализации (Protobufs, Thrift, JSON, Yaml и т. д.) не будет работать на вас.

Несколько неортодоксальный подход — использовать Erlang или Haskell, оба из которых хорошо поддерживают разбор бинарных протоколов.

person JesperE    schedule 23.01.2010
comment
Мне нужно контролировать положение полей, потому что этого требует определение протокола, с которым мы работаем. Битовые поля важны, опять же, потому что протокол определяет это. Условия необходимы, потому что набор полей может потребовать создания другого поля. Я проверю ваше руководство по Erlang и Haskell. - person Mr. T.; 24.01.2010


Как насчет самого C#?

eg

class MySimplePDLData {
  // format: name (or blank if padding), bit length, value (or blank if data),
  // name of presence flag field (or blank if no presence flag), C# type
  // one packet type per string, fields separated by pipes (|)
  string[] pdl = {

// MY-SIMPLE-PDL-START

  ",8,0xf8,|version,8,,Int32|type,8,,Int32|id1,64,,Int64",
  ...

// MY-SIMPLE-PDL-END

  };
}

Если данные уже находятся в памяти, вам не нужно выполнять ввод-вывод в формате файла. Отсюда вы можете либо динамически интерпретировать пакеты, либо генерировать необходимый исходный код C# для распознавания/упаковки/распаковки пакетов, опять же, используя сам C#.

person martinr    schedule 22.01.2010