Rust protobuf序列化都搞砸了

时间:2019-03-08 05:02:10

标签: rust protocol-buffers grpc

我正在使用rust-protobuf2.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
};

我得到的结果全都搞砸了 output

首先,如果要对整个消息进行序列化,为什么还要输入一个数字?这是一个非常奇怪的设计。

第二,您可能会在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);

并且仍然将输出弄乱了。 out

2 个答案:

答案 0 :(得分:2)

您可以使用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);
}

答案 1 :(得分:1)

此行:

str.write_message(1, &rmsg).unwrap();

将消息rmsg作为子消息写入,字段ID为1。因此,这些字段最终会比嵌套.proto更深一层嵌套:

message wrappermsg {
    user_data msg = 1;
}

正确的方法是:

rmsg.write_to(&mut str);