我正在使用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包将所有内容序列化为第二个字段的缺口字段。
我做错了什么,或者这可能是图书馆中的错误?
更新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);
您可以使用Message::write_to_bytes
序列化可以使用parse_from_bytes
解析的消息。
此外,请确保您反序列化序列化的相同类型。
这是一个正常工作的示例程序:
mod protos;
use protobuf::Message;
use protos::user_data::user_data;
fn main() {
let mut rmsg = user_data::new();
rmsg.set_id("1234".into());
rmsg.set_nick("test".into());
let msg = rmsg.write_to_bytes().unwrap();
println!("{:?}", msg);
let test: user_data = protobuf::parse_from_bytes(&msg).unwrap();
println!("serialized: {:?}\noriginal: {:?}", test, rmsg);
}
这一行:
str.write_message(1, &rmsg).unwrap();
将消息rmsg
写为带有字段id 1
的子消息。所以这些字段最终会更深一层,就像你的.proto
是:
message wrappermsg {
user_data msg = 1;
}
正确的方法是:
rmsg.write_to(&mut str);