Добрый день.
В некоторых проектах на 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 я даже обращался с вопросом. Сказали так сделать нельзя. Посоветовали способ которым я уже пользуюсь 
Резюмируя свои поиски.
bitflags! это хорошо но мало. Мне ближе bit fields. А их два. Слабенький, зато для stable, bit_field. И более весёлый, но для nightly, bitfield. В сумме с nue получилось почти хорошо. Но не так удобно.
Закралось желание попробовать написать аналог cerealed на rust. Просто из любопытства. На первый взгляд задача кажется не очень сложной.
В режиме decode-only хорошо выглядит nom. Но из него не сделать encoder. Жаль.
А вообще, всем подавай nightly и процедурные макросы. Очень охота дождаться их стабилизации.