【发布时间】:2019-03-08 05:02:09
【问题描述】:
我正在使用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);
相关的proto描述如下
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);
【问题讨论】:
-
看
write_message的描述,只写了一个字段。试试rmsg.write_to(&mut str),我只是猜测这可能会根据文档起作用。 -
为什么你认为是 Nick 字段而不是 Id 是索引之一仍然是一个谜:)
-
@JayDepp btw write_to 不存在
-
你有 Message trait 的作用域吗? Here's the method.
-
我现在包含了,但输出保持不变 write_to 和 write_message 都表现不正确
标签: rust protocol-buffers grpc