Rust protobuf 序列化一团糟

标签 rust protocol-buffers grpc

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

结果我得到的都是一团糟 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

最佳答案

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

关于Rust protobuf 序列化一团糟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55056998/

相关文章:

Android NDK 未定义对 google protobuf 的引用

Golang protobuf 动态消息

java - 如何处理 Java 中未知的 protobuf 字段?

python - 使用 google/protobuf/empty.proto 在没有参数的情况下调用 python grpc 方法期间出现 TypeError

firebase - AWS Lambda错误: Failed to load gRPC binary module because it was not installed for the current system

grpcui : command not found

redis - 访问 Redis 时出现静默错误

macros - `:expr` 后跟 `:tt` ,`expr` 片段不允许

concurrency - 如何在 Rust 中使用锁?

rust - Rust 尝试为 sin 函数创建 CORDIC 表时出现舍入错误