Посоветуйтие библитеку сериализации/десериализации в двоичный протокол

Добрый день.
В некоторых проектах на D пользовался cerealed. Сейчас есть небольшая похожая задача. Хочу попробовать Rust. Но, сходу, похожей библиотеки не нашел. Крейтов с двоичной сериализацией хватает. Но везде сериализация это самоцель.

А в cerealed двоичная сериализация используется как способ реализовать двоичный протокол обмена.
То есть хотелось бы контроль над тем как данные будут превращаться в байтики.

Пример того чем я пользовался:

struct MyStruct {
    ubyte mybyte1;
    @NoCereal uint nocereal1; //won't be serialised
    @Bits!4 ubyte nibble;
    @Bits!1 ubyte bit;
    @Bits!3 ubyte bits3;
    ubyte mybyte2;
}

auto cereal = Cerealiser();
cereal ~= MyStruct(3, 123, 14, 1, 42);
assert(cereal.bytes == [ 3, 0xea /*1110 1 010*/, 42]);
struct Packet {
    ushort length;
    @ArrayLength("length") ushort[] array;
}
auto pkt = decerealise!Packet([
    0, 3, //length
    0, 1, 0, 2, 0, 3]); //array of 3 ushorts
assert(pkt.length == 3);
assert(pkt.array == [1, 2, 3]);

Если кто пользовался или знает, был бы рад услышать рекомендации.

Я подозреваю, что вы ищете bincode.
Возможно подойдёт rmp (в сочетании с rmp-serde+serde или rmp-serialize+rustc-serialize).

Для работы с битовыми флагами подойдёт bitflags!.

Спасибо.
bincode и rmp я видел. Это не совсем то. Видимо я не совсем точно выразил чего хочу.
По сути, каждый из них реализует свой собственный “фиксированный” двоичный протокол.

А я искал возможность описать уже существующий, необходимый мне протокол (modbus или МЭК-104, как пример), в виде сериализуемых структур.

В анонсе cerealed как пример приводится формат UDP пакета. Имеют интерес первые три сообщения из анонса.

А сейчас да, я использую bitflags!, структуры с align=1 и transmute из &[u8] в свои структуры.

К bincode я даже обращался с вопросом. Сказали так сделать нельзя. Посоветовали способ которым я уже пользуюсь :slight_smile:

Резюмируя свои поиски.

bitflags! это хорошо но мало. Мне ближе bit fields. А их два. Слабенький, зато для stable, bit_field. И более весёлый, но для nightly, bitfield. В сумме с nue получилось почти хорошо. Но не так удобно.
Закралось желание попробовать написать аналог cerealed на rust. Просто из любопытства. На первый взгляд задача кажется не очень сложной.

В режиме decode-only хорошо выглядит nom. Но из него не сделать encoder. Жаль.

А вообще, всем подавай nightly и процедурные макросы. Очень охота дождаться их стабилизации.