Я использую rust-protobuf
версию 2.4
У меня есть следующий код
let mut msg = vec![];
let mut str = protobuf::CodedOutputStream::vec(&mut msg);
let mut rmsg = user_manager::user::user_data::new();
rmsg.set_id("1234".into());
rmsg.set_nick("test".into());
str.write_message(1, &rmsg).unwrap();
str.flush().unwrap();
println!("{:?}", msg);
let test: register_msg = protobuf::parse_from_bytes(&msg[..]).unwrap();
println!("serialized: {:?}\noriginal: {:?}", test, rmsg);
и соответствующее описание прототипа выглядит следующим образом
message user_data{
string id = 1; //required
string nick = 2;
string theme = 3;
string admin_id = 4;
string lang = 5;
double credit = 6; //required
double bonus_credit = 7; //required
};
и то, что я получаю в результате, все испорчено
Прежде всего, зачем мне нужно вводить номер, если я сериализую все сообщение? это действительно странный дизайн.
Во-вторых, первое поле, как вы можете видеть в файле proto, это id, но в результате сериализации показано, что пакет protobuf сериализировал все в поле nick, которое является вторым полем.
Я что-то не так делаю или это может быть ошибкой в библиотеке?
ОБНОВЛЕНИЕ 1:
Я изменил write_msg
на write_to_bytes
Вот так выглядит мой код.
let mut rmsg = user_manager::user::user_data::new();
rmsg.set_id("1234".into());
rmsg.set_nick("test".into());
let msg = rmsg.write_to_bytes().unwrap();
println!("{:?}", msg);
println!("{:?}", &msg[..]);
let test: register_msg = protobuf::parse_from_bytes(&msg).unwrap();
println!("serialized: {:?}\noriginal: {:?}", test, rmsg);
и, тем не менее, вывод все испорчен.